| Literature DB >> 33989350 |
Vasileios Kouliaridis1, Georgios Kambourakis2, Efstratios Chatzoglou1, Dimitrios Geneiatakis3, Hua Wang4.
Abstract
Contact tracing has historically been used to retard the spread of infectious diseases, but if it is exercised by hand in large-scale, it is known to be a resource-intensive and quite deficient process. Nowadays, digital contact tracing has promptly emerged as an indispensable asset in the global fight against the coronavirus pandemic. The work at hand offers a meticulous study of all the official Android contact tracing apps deployed hitherto by European countries. Each app is closely scrutinized both statically and dynamically by means of dynamic instrumentation. Depending on the level of examination, static analysis results are grouped in two axes. The first encompasses permissions, API calls, and possible connections to external URLs, while the second concentrates on potential security weaknesses and vulnerabilities, including the use of trackers, in-depth manifest analysis, shared software analysis, and taint analysis. Dynamic analysis on the other hand collects data pertaining to Java classes and network traffic. The results demonstrate that while overall these apps are well-engineered, they are not free of weaknesses, vulnerabilities, and misconfigurations that may ultimately put the user security and privacy at risk.Entities:
Mesh:
Year: 2021 PMID: 33989350 PMCID: PMC8121305 DOI: 10.1371/journal.pone.0251867
Source DB: PubMed Journal: PLoS One ISSN: 1932-6203 Impact factor: 3.240
Outline of the examined apps.
| App’s name | Country | Analysed version | GAEN | Open-source |
|---|---|---|---|---|
| Stopp Corona [ | Austria | 2.0.8.1133 | ✓ | ✓ |
| Coronalert [ | Belgium | 1.11.2 | ✓ | ✓ |
| ViruSafe [ | Bulgaria | 1.0.3 | ✗ | ✓ |
| Stop COVID-19 [ | Croatia | 2.2.0 | ✓ | ✓ |
| CovTracer [ | Cyprus | 1.3.2 | ✓ | ✓ |
| eRouska [ | Czech Republic | 2.2.687 | ✓ | ✓ |
| Smittestop [ | Denmark | 2.1.1 | ✓ | ✗ |
| Hoia [ | Estonia | 1.0.8 | ✓ | ✗ |
| Koronavilkku [ | Finland | 2.0.2 | ✓ | ✓ |
| TousAntiCovid [ | France | 2.2.3 | ✗ | ✗ |
| Corona-Warn-App [ | Germany | 1.10.1 | ✓ | ✓ |
| VirusRadar [ | Hungary | 1.0.0 | ✗ | ✗ |
| COVID Tracker [ | Ireland | 1.0.4 | ✓ | ✓ |
| Immuni [ | Italy | 2.2.1 | ✓ | ✓ |
| Apturi Covid [ | Latvia | 1.1 | ✓ | ✓ |
| Korona Stop LT [ | Lithuania | 1.1.1 | ✓ | ✗ |
| COVID Alert [ | Malta | 1.3.5 | ✓ | ✓ |
| CoronaMelder [ | Netherlands | 1.2.2 | ✓ | ✓ |
| Smittestopp [ | Norway | 1.0.3 | ✓ | ✓ |
| STOP COVID—ProteGO Safe [ | Poland | 4.9.0 | ✓ | ✓ |
| STAYAWAY COVID [ | Portugal | 1.1.2 | ✓ | ✓ |
| ZostanZdravy [ | Slovakia | 1.1.0 | ✗ | ✓ |
| #OstaniZdrav [ | Slovenia | 1.10.1 | ✓ | ✗ |
| Radar COVID [ | Spain | 1.2.0 | ✓ | ✓ |
| SwissCovid [ | Switzerland | 1.3.1 | ✓ | ✓ |
| NHS COVID-19 [ | UK | 4.3 | ✓ | ✓ |
The interested reader can also refer to [4], which gathers all GAEN-based apps worldwide.
‡Centralised/proprietary approach.
†Formerly known as CovTracer. It embraced GAEN on Dec. 2020.
*From ver. 2.0 onward. Prior versions were based on a centralised framework.
#The official website at https://korona.gov.sk/en/ provides a dead link to Google Play Store.
Fig 1Overview of the followed methodology.
Overview of requested permissions per app vis-à-vis the baseline.
| App | BLUETOOTH | INTERNET | Extra permissions |
|---|---|---|---|
| Stopp Corona | + | + | – |
| Coronalert | + | + | – |
| ViruSafe | – | + | |
| Stop COVID-19 | + | + | – |
| CovTracer | + | + | – |
| eRouska | + | + | – |
| Smittestop | + | + | – |
| Hoia | + | + | – |
| KoronaVilkku | + | + | – |
| TousAntiCovid | + | + | |
| Corona-Warn-App | + | + | |
| VirusRadar | + | + | |
| COVID Tracker | + | + | – |
| Immuni | + | + | – |
| Apturi Covid | + | + | – |
| Korona Stop LT | + | + | – |
| COVID Alert | + | + | – |
| CoronaMelder | + | + | – |
| Smittestopp | + | + | – |
| STOP COVID—ProteGO Safe | + | + | – |
| STAYAWAY COVID | + | + | – |
| ZostanZdravy | + | + | |
| #OstaniZdrav | + | + | – |
| Radar COVID | + | + | – |
| SwissCovid | + | + | – |
| NHS COVID-19 | + | + | |
| Total | 25 | 26 | – |
TLS server security level rating of external URLs per app.
| App | Number of URLs | Domain ratings | Domains |
|---|---|---|---|
| Stopp Corona | 3 | A | |
| A | |||
| A+ | |||
| Coronalert | 5 | A | |
| A | coronalert-prd.ixor.be | ||
| A | c19statcdn-prd.ixor.be | ||
| A | c19-submission-prd.ixor.be | ||
| A | c19-verification-prd.ixor.be | ||
| ViruSafe | 1 | A | |
| Stop COVID-19 | 0 | – | – |
| CovTracer | 2 | A | |
| B | covtracer.dmrid.gov.cy | ||
| eRouska | 1 | A+ | |
| Smittestop | 0 | – | – |
| Hoia | 4 | A | |
| A+ | |||
| A+ | |||
| A | |||
| KoronaVilkku | 2 | A | |
| A+ | |||
| TousAntiCovid | 5 | B | |
| B | |||
| T | |||
| T | |||
| A | |||
| Corona-Warn-App | 1 | N/A (dead link) | |
| VirusRadar | 2 | B | |
| A+ | |||
| COVID Tracker | 0 | – | – |
| Immuni | 1 | A+ | |
| Apturi Covid | 3 | A+ | |
| A+ | apturicovid-api.spkc.gov.lv | ||
| A+ | apturicovid-files.spkc.gov.lv | ||
| Korona Stop LT | 3 | B | |
| B | |||
| B | |||
| COVID Alert | 4 | B | |
| A | |||
| A | |||
| A | |||
| CoronaMelder | 2 | A+ | |
| B | |||
| Smittestopp | 1 | A | |
| STOP COVID—ProteGO Safe | 2 | A+ | |
| A+ | |||
| STAYAWAY COVID | 2 | F | |
| A | |||
| ZostanZdravy | 1 | B | |
| #OstaniZdrav | 0 | – | – |
| Radar COVID | 1 | A | |
| SwissCovid | 3 | A | |
| T | |||
| A | |||
| NHS COVID-19 | 0 | – | – |
| Total | 49 | 13xA+, 21xA, 10xB, 3xT, 1xF |
Categorisation of sensitive API calls discovered in the apps.
| Relevant System | API Calls |
|---|---|
| Cellular Network | android/telephony/TelephonyManager; → getNetworkOperatorName() |
| android/telephony/TelephonyManager; → getNetworkOperator() | |
| android/telephony/TelephonyManager; → getLine1Number() | |
| android/telephony/TelephonyManager; → getSimOperatorName() | |
| android/telephony/TelephonyManager; → getSimCountryIso() | |
| android/telephony/TelephonyManager; → getCellLocation() | |
| Location | android/location/LocationManager; → getLastKnownLocation() |
| android/location/LocationManager; → requestLocationUpdates() | |
| android/location/Location; → getLatitude() | |
| android/location/Location; → getLongitude() | |
| Camera | android/hardware/Camera; → open() |
| android/hardware/camera2/CameraManager; → |
*All class methods.
Potentially privacy-invasive API call groups per app.
| App | Cellular Network | Location | Camera |
|---|---|---|---|
| Stopp Corona | – | +* | – |
| Coronalert | – | +* | +* |
| ViruSafe | – | + | – |
| Stop COVID-19 | – | +* | – |
| CovTracer | + | +* | – |
| eRouska | – | +* | – |
| Smittestop | – | +* | – |
| Hoia | – | +* | – |
| KoronaVilkku | – | +* | – |
| TousAntiCovid | – | + | + |
| Corona-Warn-App | – | +* | + |
| VirusRadar | – | + | – |
| COVID Tracker | + | +* | – |
| Immuni | – | +* | – |
| Apturi Covid | – | +* | +* |
| Korona Stop LT | – | +* | – |
| COVID Alert | – | +* | – |
| CoronaMelder | – | +* | – |
| Smittestopp | + | +* | – |
| STOP COVID—ProteGO Safe | – | +* | – |
| STAYAWAY COVID | – | +* | – |
| ZostanZdravy | – | + | – |
| #OstaniZdrav | – | +* | +* |
| Radar COVID | – | +* | – |
| SwissCovid | – | +* | – |
| NHS COVID-19 | – | +* | + |
| Total | 3 | 26 | 6 |
The asterisk indicates that at least one API call does not coincide with the permissions requested by this app.
Potential weaknesses and other security issues per app.
| App Name | Signer certificate information | Janus | Network Security | CWE-330 | CWE-276 | CWE-532 | CWE-312 | CWE-89 | CWE-327 | CWE-295 | CWE-749 | CWE-919 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Stopp Corona | – | + | – | + | + | – | – | – | – | – | – | – |
| Coronalert | – | + | – | + | + | + | + | + | – | + | – | – |
| ViruSafe | – | + | – | + | – | + | + | + | AES ECB | – | – | – |
| Stop COVID-19 | – | + | – | + | + | + | – | – | – | – | – | – |
| CovTracer | – | + | – | + | – | + | + | + | MD5, AES-ECB | – | – | – |
| eRouska | – | + | – | + | – | + | + | – | – | – | – | |
| Smittestop | – | + | – | – | + | + | – | – | – | – | – | – |
| Hoia | – | + | – | + | – | + | + | + | – | – | – | – |
| Koronavilkku | – | + | – | + | + | + | + | + | – | – | – | – |
| TousAntiCovid | – | + | – | + | + | + | + | – | – | – | – | – |
| Corona-Warn-App | – | + | – | + | + | + | – | + | MD5, SHA1 | + | – | – |
| VirusRadar | – | + | – | + | + | + | + | – | – | – | – | – |
| COVID Tracker | – | + | – | + | ++ | + | + | + | SHA1 | – | – | – |
| Immuni | – | + | – | + | + | + | + | – | – | + | – | – |
| Apturi Covid | – | + | – | + | + | + | + | – | – | – | – | – |
| Korona Stop LT | – | + | – | + | – | + | – | + | SHA1 | + | – | – |
| COVID Alert | SHA1withRSA (SHA256withRSA) | + | – | + | – | – | + | + | – | – | – | – |
| CoronaMelder | – | + | – | + | ++ | + | + | + | – | – | – | – |
| Smittestopp | – | + | – | + | + | + | + | + | – | – | – | – |
| STOP COVID—ProteGO Safe | – | + | – | + | – | + | – | – | – | – | + | – |
| STAYAWAY COVID | – | + | – | + | – | + | + | + | – | – | – | – |
| ZostanZdravy | – | + | Domain is insecurely configured and permits clear text traffic | + | ++ | + | – | + | MD5, SHA1, AES-ECB | – | – | – |
| #OstaniZdrav | – | + | – | + | + | + | – | + | MD5, SHA1 | + | – | – |
| Radar COVID | – | + | – | + | – | + | + | + | – | – | – | – |
| SwissCovid | – | + | – | + | – | + | + | + | – | – | – | – |
| NHS Covid-19 | – | + | Domain is insecurely configured and permits clear text traffic | + | + | + | + | – | – | – | – | + |
| Total | 1 | 26 | 2 | 25 | 16 | 24 | 18 | 17 | 7 | 5 | 1 | 1 |
Potentially vulnerable components in the manifest file of each app.
| App Name | Intent-filter on | Intent-filter off | Cleartext | ||||
|---|---|---|---|---|---|---|---|
| Service | Broadcast Receiver | Activity | Service | Broadcast Receiver | Activity | ||
| Stopp Corona | – | – | 1 | – | 1 | – | – |
| Coronalert | – | – | – | 1 | – | – | – |
| ViruSafe | – | – | – | – | 1 | – | – |
| Stop COVID-19 | – | 1 | – | – | – | – | – |
| CovTracer | – | – | – | – | 1 | 1 | – |
| eRouska | – | – | – | 1 | – | 2 | – |
| Smittestop | – | 4 | 1 | – | – | – | – |
| Hoia | – | 1 | – | – | – | – | – |
| Koronavilkku | – | – | – | – | – | – | – |
| TousAntiCovid | – | – | – | – | – | – | – |
| Corona-Warn-App | – | – | – | 1 | – | – | – |
| VirusRadar | – | – | – | – | – | – | – |
| COVID Tracker | – | 1 | – | – | – | – | – |
| Immuni | – | 1 | – | – | – | – | – |
| Apturi Covid | – | 1 | – | – | – | – | – |
| Korona Stop LT | – | – | – | 1 | – | – | – |
| COVID Alert | – | 1 | – | – | – | – | – |
| CoronaMelder | – | 2 | – | 1 | – | – | – |
| Smittestopp | – | 3 | 1 | – | – | – | – |
| STOP COVID—ProteGO Safe | – | 1 | – | 1 | – | – | – |
| STAYAWAY COVID | – | 1 | – | – | – | – | – |
| ZostanZdravy | 1 | 1 | – | 1 | – | – | + |
| #OstaniZdrav | – | – | – | 1 | – | – | – |
| Radar COVID | – | 1 | – | – | – | – | – |
| SwissCovid | – | 1 | – | – | – | – | – |
| NHS COVID-19 | – | 2 | – | 1 | – | – | – |
| Total | 1 | 15 | 3 | 8 | 3 | 2 | 1 |
Shared library issues per app.
| App Name | NX | PIE | Stack Canary | RELRO |
|---|---|---|---|---|
| Stopp Corona | – | – | – | – |
| Coronalert | – | 8 | – | 8 |
| ViruSafe | – | – | – | – |
| Stop COVID-19 | – | – | – | – |
| CovTracer | – | 92 | – | 92 |
| eRouska | – | – | – | – |
| Smittestop | 409 | 560 | 546 | 568 |
| Hoia | – | – | – | – |
| Koronavilkku | – | 4 | – | 4 |
| TousAntiCovid | – | – | – | – |
| Corona-Warn-App | – | 8 | – | 8 |
| VirusRadar | – | – | – | – |
| COVID Tracker | – | 83 | – | 83 |
| Immuni | – | 4 | – | 4 |
| Apturi Covid | – | – | – | – |
| Korona Stop LT | – | 8 | – | 8 |
| COVID Alert | – | – | – | – |
| CoronaMelder | – | – | – | – |
| Smittestopp | 525 | 594 | 583 | 611 |
| STOP COVID—ProteGO Safe | – | 4 | – | 4 |
| STAYAWAY COVID | – | 80 | – | 80 |
| ZostanZdravy | – | – | – | – |
| #OstaniZdrav | – | 8 | – | 8 |
| Radar COVID | – | – | – | – |
| SwissCovid | – | – | – | – |
| NHS COVID-19 | – | – | – | – |
| Total | 2 | 12 | 2 | 12 |
Outdated third-party software components per app.
| App Name | SQLite | OpenSSL | libjpeg |
|---|---|---|---|
| Stopp Corona | – | – | – |
| Coronalert | + | + | – |
| ViruSafe | – | – | – |
| Stop COVID-19 | – | – | – |
| CovTracer | – | – | + |
| eRouska | – | – | – |
| Smittestop | – | – | – |
| Hoia | – | – | – |
| Koronavikku | + | + | – |
| TousAntiCovid | – | – | – |
| Corona-Warn-App | + | + | – |
| VirusRadar | – | – | – |
| COVID Tracker | + | + | + |
| Immuni | – | – | – |
| Apturi Covid | – | – | – |
| Korona Stop LT | + | + | – |
| COVID Alert | – | – | – |
| CoronaMelder | – | – | – |
| Smittestopp | – | – | – |
| STOP COVID—ProteGO Safe | – | – | – |
| STAYAWAY COVID | – | – | + |
| ZostanZdravy | – | – | – |
| #OstaniZdrav | + | + | – |
| Radar COVID | – | – | – |
| SwissCovid | – | – | – |
| NHS COVID-19 | – | – | – |
| Total | 6 | 6 | 3 |
Fig 2Issues identified through taint analysis.
Dynamic analysis results.
| App | Net. traffic | Location | Telephony | Bluetooth |
|---|---|---|---|---|
| Stopp Corona | + | – | + | + |
| Coronalert | + | + | + | + |
| ViruSafe | N/A | N/A | N/A | N/A |
| Stop COVID-19 | + | + | + | + |
| CovTracer | + | + | + | + |
| eRouska | + | + | + | + |
| Smittestop | – | – | + | + |
| Hoia | + | – | + | + |
| KoronaVilkku | – | + | + | + |
| TousAntiCovid | + | – | + | + |
| Corona-Warn-App | + | + | + | + |
| VirusRadar | N/A | N/A | N/A | N/A |
| COVID Tracker | + | + | + | + |
| Immuni | + | + | + | + |
| Apturi Covid | + | + | + | + |
| Korona Stop LT | + | + | + | + |
| COVID Alert | + | – | + | + |
| CoronaMelder | + | + | + | + |
| Smittestopp | – | – | + | + |
| STOP COVID—ProteGO Safe | + | + | + | + |
| STAYAWAY COVID | + | – | + | + |
| ZostanZdravy | + | – | + | – |
| #OstaniZdrav | + | + | + | + |
| Radar COVID | + | – | + | + |
| SwissCovid | + | – | + | + |
| NHS COVID-19 | + | – | + | + |
| Total | 21 | 13 | 24 | 23 |
*Excluded from analysis.