The SQLite Magellan Bug, And Your App
Recently, Tencent’s Blade Team published some notes about a bug that they call Magellan. The underlying flaw is in SQLite and its handling of full-text search “shadow tables” (FTS3, FTS4, etc.). An attacker that can either execute arbitrary SQL or give you an arbitrary database to use might be able to write arbitrary content to files via this bug. If that “arbitrary content” represents executable code, the attacker might be able to execute it. Hence, this is characterized by Tencent as a remote code execution (RCE) vulnerability.
Most Android apps should not be affected by this. Here are some categories of development techniques that might be at risk.
You Execute Arbitrary SQL from Arbitrary Sources
Many places are going to describe this as a Chromium (or Chrome) bug, rather than a SQLite bug. That is because Chromium offers WebSQL, allowing Web pages to create and manipulate relational databases on the client side… and Chromium’s WebSQL is implemented using SQLite.
Most Android apps that use SQLite execute their own SQL, whether hard-coded or generated via some library (e.g., Room). Few Android apps accept SQL statements from arbitrary sources and execute them. If you do, your app may be at risk.
At minimum, this bug could corrupt your app’s database or other accessible files. It is conceivable that an attacker could use this to remotely execute code, if your app executes arbitrary code. For example, if you use the support multidex library on Android 4.4 and older, in theory this attack could be exploited the way that Samsung was in 2015.
You Open Arbitrary Databases
That being said, if you allow the user to open a SQLite database that your app did not create, your app may be at risk.
SQLite’s “Defense Against Dark Arts”
page recommends that you run
PRAGMA integrity_check or
on all foreign databases before doing anything else. Unfortunately, these were
added in SQLite 3.20.0, and so they are only available on Android 9.0 and higher,
at least in terms of the framework SQLite implementation.
WebView to View Arbitrary Content
WebView supports WebSQL, apparently (I have not used it personally).
If you allow the user to view arbitrary Web content in a
WebView, your app may be at risk.
If, however, you are only loading your own content (e.g., help pages packaged
as assets), you may be safe.
Google has the responsibility for updating
WebView on newer Android versions
for Google Play ecosystem devices. Older devices (Android 4.x and below) will
be at risk indefinitely. Devices outside the Google Play ecosystem would need
to have their
WebView implementations updated by their manufacturers or custom
ROM developers, presumably.
Depending on the nature of the app, you might consider trying to disable WebSQL
WebView, if that is possible (again, I have no personal WebSQL experience here).
UPDATE 2018-12-18: Craig Russell points out that
WebSettings should control WebSQL access.
The specific bug here was fixed in SQLite 3.26.0. No current version of Android uses that — even Android 9.0 is back on 3.22.0. IMHO, it is very unlikely that Google would ship a replacement SQLite implementation in a security fix, and at this point I am not expecting to see an Android 9.1 release. So, most likely, the framework SQLite issue will not be fixed until the next major version of Android, in 2019.
If your app packages its own copy of SQLite, rather than use the framework copy, aim to upgrade to something based off of SQLite 3.26.0 or higher as soon as possible. For example, SQLCipher for Android 4.0.0 just shipped, but it is based on 3.25.2, so SQLCipher for Android users should keep an eye out for future updates.
The best collection of accessible information that I see about this bug is at this Hacker News page. My understanding is that the “SQLite” user there is Dr. Richard Hipp, the creator of SQLite.
Need an extra hand with your Android app development project? CommonsWare can help — reach out for details!