SAST-Tools im Geschwindigkeitsvergleich: Snyk Code vs. SonarQube und LGTM
Frank Fischer
22. Juli 2021
0 Min. LesezeitWir wurden gebeten, die Scan-Zeiten von Snyk Code und zwei verbreiteten SAST-Tools zu vergleichen: LGTM und SonarQube. Für unsere Untersuchung haben wir einige Annahmen getroffen. Um transparent zu sein, legen wir die Details offen.
Kurz zusammengefasst
Static Application Security Testing (SAST) ist nur dann entwicklerfreundlich, wenn es nahezu in Echtzeit Feedback liefert und Ihre Entwicklungsprozesse nicht verzögert. Snyk Code ist bis zu 106-mal schneller als LGTM. Im Durchschnitt ist Snyk Code fünfmal schneller als SonarQube und 14-mal schneller als LGTM. Zusammenfassend erweist sich Snyk Code als eine der schnellsten semantischen Scan-Engines auf dem Markt.
Testfeld
Wir haben 48 Open-Source-Repositories mit JavaScript ausgewählt (siehe Liste unten). Damit wollten wir typische moderne Entwickler-Codebasen nachbilden. JavaScript schien dafür eine geeignete gemeinsame Grundlage zu sein. Um reale Herausforderungen abzubilden, haben wir eine zufällige Stichprobe aus den am besten bewerteten Repositories auf GitHub ausgewählt.
Als Scanner haben wir die Community Edition von SonarQube verwendet, ein weit verbreitetes Open-Source-Tool für statische Analysen. Da es lokal ausgeführt wird, brauchten wir einen recht leistungsfähigen PC. Frühere Tests mit der kostenlosen SonarCloud-Edition haben gezeigt: SonarQube ist auf einem guten PC schneller als die kostenlose SonarCloud-Version. Es ist daher fair, statt der Cloud-Version die lokale Engine zu verwenden. Wir mussten dafür auf einen der vorhandenen Entwicklerrechner zurückgreifen (Details unten). Der zweite Kandidat ist LGTM, das ursprünglich von Semmle stammt, einem von GitHub übernommenen Unternehmen. LGTM verwendet eine tiefgehende semantische Codesuche auf Basis von CodeQL. Wir haben das LGTM-SaaS-Angebot genutzt.
Schließlich ist Snyk Code die SAST-Lösung von Snyk. Sie basiert auf der früheren DeepCode-Scan-Engine, die inzwischen mehrere Monate zusätzlicher Entwicklungsarbeit bei Snyk durchlaufen hat. Neben ihrer Entwicklerfreundlichkeit und hohen Genauigkeit ist eines der Designziele von Snyk Code eine besonders hohe Geschwindigkeit. Dafür kommt eine proprietäre Constraint-Engine zum Einsatz. Wir haben dieses Testfeld ausgewählt, weil (1) die Lizenzen Vergleichstests erlauben, (2) es sich um semantische Engines und nicht um Linter wie ESLint handelt, (3) diese Engines weit verbreitet sind und (4) sowohl eine lokal ausgeführte Engine als auch ein SaaS-Angebot vertreten sind.
Geschwindigkeit ist entscheidend, wenn eine SAST-Lösung entwicklerfreundlich sein soll. Es ist allgemein bekannt, dass Entwickler am effizientesten arbeiten, wenn Sicherheitsprobleme während der Entwicklung erkannt werden und sich beheben lassen, bevor der Code eingecheckt wird. Dann ist ihnen der Code noch präsent. Snyk Code bietet IDE-Plugins, die sich nahtlos in den Entwickler-Workflow integrieren. Darüber hinaus stellt Snyk Code leicht verständliche Datenflussdiagramme und ausführliche Erklärungen bereit, einschließlich Beispielen für Korrekturen in Open-Source-Bibliotheken mit demselben Kontext. Für diesen Test haben wir uns jedoch auf die Geschwindigkeit konzentriert.
Für unseren Test haben wir jedes Repository einmal gescannt: SonarQube lokal, LGTM und Snyk Code als SaaS. Wie oben erwähnt, haben wir die Repositories so ausgewählt, dass die Scan-Zeiten nicht von der Netzwerkbandbreite abhängen.
Außerdem haben wir reale Open-Source-Repositories statt Benchmarks ausgewählt, da wir nachbilden wollten, was Entwickler tatsächlich tun. Benchmarks für den Vergleich von SAST-Tools bringen eigene Probleme mit sich und hätten uns in diesem Fall nicht weitergeholfen.
Testergebnisse
Unten finden Sie die allgemeinen statistischen Werte (gerundet) für die Scan-Zeit in Sekunden (n=48, auf ganze Zahlen gerundet):
Durchschnitt | Maximum | Minimum | 5. Perzentil | 95. Perzentil | Median | Standardabweichung | |
|---|---|---|---|---|---|---|---|
SonarQube | 110 | 895 | 63 | 63 | 257 | 77 | 127 |
LGTM | 312 | 1835 | 2 | 141 | 1046 | 189 | 352 |
Snyk Code | 22 | 162 | 5 | 5 | 72 | 12 | 28 |
Hier sehen Sie die Ergebnisse als Streudiagramm (niedrigere Werte sind besser, logarithmische Skala, erstellt mit R und ggplot2):

Die logarithmische Achse überbetont die Streuung im unteren Bereich. Die Standardabweichung von Snyk Code ist beispielsweise tatsächlich deutlich geringer als die von SonarQube.
Unten sehen Sie ein Boxplot der Werte (niedrigere Werte sind besser; für die Darstellung aller Werte im Diagramm haben wir eine logarithmische Skala verwendet; erstellt mit R und ggplot2; Median und Durchschnitt sind eingezeichnet):

Das Diagramm zeigt deutlich, dass Snyk in den meisten Fällen dramatisch schneller ist als die beiden anderen Tools. Der Median von Snyk ist 6,7-mal (SonarQube) bis 16,4-mal (LGTM) schneller. Das zeigt, dass die Ergebnisse nicht auf einigen besonders guten Ausreißern beruhen, sondern allgemein gelten.
Im obigen Diagramm fällt die Streuung der Werte in der LGTM-Spalte auf. Sie reicht ungefähr von 2 Minuten (noch akzeptabel) bis zu mehr als 17 Minuten (nicht akzeptabel). Entwickler werden während ihres Arbeitstags nicht mehrere Minuten auf Ergebnisse warten. Zum Glück liegt der LGTM-Median bei etwa 3 Minuten.
Im Vergleich zum ersten Geschwindigkeitstest, den wir damals noch als DeepCode und jetzt als Snyk Code durchgeführt haben, stellten wir deutliche Leistungsverbesserungen fest. In den vergangenen Monaten haben wir das Laden in den Cloud-Service erheblich optimiert. Außerdem war SonarQube diesmal schneller, wahrscheinlich weil wir im Vergleich zum ersten Test einen leistungsfähigeren PC mit mehr Parallelisierungsmöglichkeiten verwendet haben.
Eine weitere interessante Beobachtung: SaaS-Engines und lokal installierte Engines unterscheiden sich in puncto Geschwindigkeit gar nicht so sehr.
Annahmen und Einschränkungen
Wir haben SonarQube (Community Edition 8.9.1) und LGTM ausgewählt, da die Lizenzen solche Vergleiche erlauben und beide Tools weit verbreitet sind.
Wir haben 48 mittelgroße JavaScript-Repositories ausgewählt, da dieses Testfeld die Arbeit typischer Entwickler abzubilden scheint. Die zufällige Stichprobe stammt aus den rund 200.000 nach Sternen sortierten GitHub-Repositories. Die Codegröße war kein Auswahlkriterium.
Wir haben einen vollständigen Scan erzwungen und keinen differentiellen Scan verwendet. Snyk Code führt beispielsweise in IDE-Plugins nach einem ersten Scan differentielle Scans durch und spart dadurch Bandbreite.
Wir haben einen Intel Xeon mit 2 GHz, 16 Kernen und 64 GB RAM verwendet.
Sichern Sie Ihren Code mit modernsten Erkenntnissen
Lernen Sie in nur 30 Minuten das gesamte Funktionsspektrum von Snyk Code SAST kennen.
Rohdaten
Wir stellen auch die Rohdaten bereit, damit Sie Ihre eigenen statistischen Auswertungen vornehmen können. (Zeiten in Sekunden)
Repository | SonarQube | LGTM | Snyk Code |
|---|---|---|---|
neumino/chateau | 101 | 259 | 9 |
ecomfe/etpl | 80 | 237 | 24 |
ustwo/ustwo.com-frontend | 77 | 278 | 20 |
node-inspector/node-inspector | 157 | 373 | 21 |
q-nick/npm-gui | 71 | 227 | 8 |
dojo/dojox | 317 | 662 | 53 |
majimboo/node-benchmarks | 63 | 141 | 5 |
prettier/prettier | 84 | 277 | 45 |
d3/d3.github.com | 895 | 1104 | 67 |
adobe/node-smb-server | 79 | 194 | 13 |
noble/bleno | 66 | 141 | 5 |
wagtail/wagtail | 115 | 1462 | 56 |
meteor/blaze | 83 | 194 | 12 |
dwyl/hapi-socketio-redis-chat-example | 68 | 141 | 5 |
chancancode/hn-reader | 64 | 165 | 20 |
shipshapecode/ember-shepherd | 82 | 152 | 30 |
draptik/angulardemorestful | 76 | 163 | 6 |
icebob/vue-express-mongo-boilerplate | 77 | 422 | 9 |
ngryman/ribs | 64 | 193 | 7 |
rjrodger/seneca-examples | 70 | 176 | 12 |
telepat-io/telepat-api | 68 | 173 | 8 |
sematext/logagent-js | 68 | 162 | 8 |
cookpad/elasticfox-ec2tag | 87 | 173 | 11 |
polonel/trudesk | 170 | 1835 | 77 |
saintedlama/passport-local-mongoose | 72 | 173 | 7 |
cholalabs/passport-localapikey | 63 | 3 | 5 |
mozilla/openbadger | 79 | 184 | 20 |
inbasic/turbo-download-manager | 94 | 206 | 31 |
pgherveou/gulp-awspublish | 65 | 152 | 5 |
swagger-api/swagger-socket | 93 | 746 | 7 |
tactivos/jquery-sew | 69 | 225 | 5 |
johansatge/jpeg-autorotate | 63 | 152 | 6 |
mqttjs/mqtt-packet | 65 | 173 | 12 |
fulcrum-agile/fulcrum | 80 | 152 | 18 |
microweber/microweber | 300 | 937 | 162 |
adamhalasz/uniqid | 68 | 151 | 5 |
componentjs/builder2.js | 71 | 142 | 8 |
frankyghost/projekktor | 92 | 195 | 9 |
nielsutrecht/jwt-angular-spring | 88 | 288 | 8 |
petereigenschink/steganography.js | 69 | 141 | 5 |
mixteam/mixsln | 75 | 205 | 48 |
borismus/webvr-boilerplate | 70 | 213 | 42 |
arrix/node-readability | 77 | 152 | 19 |
iamcal/js-emoji | 72 | 412 | 6 |
jbavari/ionic-socket.io-redis-chat | 149 | 384 | 19 |
cheeaun/steepless | 69 | 142 | 5 |
joewalker/devtools.html | 177 | 2 | 74 |
gaearon/react-hot-loader | 80 | 162 | 15 |