Skip to main content

SAST-Tools im Geschwindigkeitsvergleich: Snyk Code vs. SonarQube und LGTM

Artikel von

Frank Fischer

22. Juli 2021

0 Min. Lesezeit

Wir 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):

Streudiagramm zum Vergleich der Scan-Zeiten von LGTM, SonarQube und Snyk Code auf einer logarithmischen Skala

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):

Boxplot zum Vergleich der Scanzeiten in logarithmischen Sekunden für die Engines LGTM, SonarQube und Snyk Code.

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

Gepostet in: