Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
I'd recommend understanding what you're doing and why before dropping this in, but chances are that you have a DATABASES dict that looks something like:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': DBNAME,
'USER': USER,
'PASSWORD': aws_client.generate_db_auth_token(HOST, PORT, USER),
'HOST': HOST,
'PORT': PORT,
'OPTIONS': {
'ssl': {
'ca': 'certs/rds-cert.pem'
}
}
}
}
And you've discovered that after ~15 minutes you make a request and receive Access Denied for user@instance
because the password has expired.
This package allows you to generate the password at connection time by passing a callable instead:
def generate_pw():
return aws_client.generate_db_auth_token(HOST, PORT, USER)
DATABASES = {
'default': {
'ENGINE': 'mysql_rds.backend',
'NAME': DBNAME,
'USER': USER,
'PASSWORD': generate_pw,
'HOST': HOST,
'PORT': PORT,
'CONN_MAX_AGE': 900,
'OPTIONS': {
'ssl': {
'ca': 'certs/rds-cert.pem'
}
}
}
}
I recommend setting a CONN_MAX_AGE
of 900 as the generated auth token expires after 900 seconds. This ensures that connections requiring a refresh recreated. You can pass any function as the password and it will be evaluated at connection time. For testing locally if you cannot connect to directly to RDS you can do something like:
def generate_pw():
return 'password'
$ pip install django-mysql-rds
or
$ git clone git@github.com:cramshaw/django-mysql-rds.git
When I searched for a way to connect to an AWS RDS MySQL instance using SSL inside Django, I was unable to find anything that could handle the fact that the db auth token generated by AWS would expire every 15 minutes.
The problem is that when anything in the settings module changes, Django needs to reload. This isn't practical in a long running web app. I needed a way for the password to be generated at the time of connection.
On close inspection of the django.db.backends.mysql
code, it became clear that the DatabaseWrapper.get_connection_params
method takes the settings dict, and transforms it into the kwargs that are passed to mysql.connect
. I have subclassed this and extended to recognise if the password passed in is a callable, and if so, to call it and pass on the returned value. This leads to
Django receiving a fresh password every time a connection is created.
A very similar thing happens in the DatabaseClient.settings_to_cmd_args
which is used for things like dumping and loading data. This has also been subclassed and changed to ensure the password generation method actually runs before attempting to create a run a shell.
Whilst this works for me running django==2.2
and should work exactly the same as the built in MySQL backend, there are no guarantees.
I only needed this to work for MySQL. I haven't explored whether RDS does the same for Postgres or other databases, but the same principle ought to apply.
Tests require mysqlclient installed.
$ brew install mysql-client
$ export PATH="/usr/local/opt/mysql-client/bin:$PATH"
Then to run:
$ python -m unittest tests/test*
Bump version in setup.py then:
$ rm -rf dist/
$ python3 setup.py sdist bdist_wheel
$ python3 -m twine upload dist/*
FAQs
Unknown package
We found that django-mysql-rds demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.