Comparação de velocidade de ferramentas SAST: Snyk Code vs. SonarQube e LGTM
Frank Fischer
22 de julho de 2021
0 minutos de leituraRecebemos pedidos para comparar os tempos de varredura do Snyk Code com os de duas ferramentas SAST populares: LGTM e SonarQube. Para nossa pesquisa, fizemos algumas suposições, mas compartilhamos os detalhes para garantir a transparência.
Resumo
O Teste estático de segurança de aplicações (SAST) só é compatível com o trabalho dos desenvolvedores quando oferece feedback quase em tempo real e não atrasa os processos de desenvolvimento. O Snyk Code é até 106 vezes mais rápido que o LGTM. Em média, o Snyk Code é 5 vezes mais rápido que o SonarQube e 14 vezes mais rápido que o LGTM. Em resumo, o Snyk Code é um dos mecanismos de varredura semântica mais rápidos do mercado.
Cenário de teste
Selecionamos 48 repositórios JavaScript de código aberto (listados abaixo). A ideia era reproduzir conjuntos de código comuns no desenvolvimento moderno, e JavaScript pareceu um denominador comum adequado. Escolhemos uma amostra aleatória de repositórios bem avaliados no GitHub para representar desafios do mundo real.
Como scanners, usamos a Community Edition do SonarQube, uma ferramenta de análise estática de código aberto amplamente utilizada. Ela é executada localmente, então precisamos de um computador razoavelmente potente. Como testes anteriores com a edição gratuita do SonarCloud mostraram que o SonarQube é mais rápido em um bom computador, não é injusto usar o mecanismo local em vez da versão na nuvem. Precisamos usar uma das máquinas de desenvolvimento disponíveis (detalhes abaixo). O segundo concorrente é o LGTM, criado pela empresa Semmle, adquirida pelo GitHub. O LGTM usa pesquisa semântica profunda de código baseada no CodeQL. Usamos a oferta SaaS do LGTM.
Por fim, o Snyk Code é a solução SAST da Snyk. Ele é baseado no antigo mecanismo de varredura DeepCode, que já passou por vários meses de desenvolvimento adicional na Snyk. Além de ser fácil de usar para desenvolvedores e altamente preciso, um dos objetivos de design do Snyk Code é ser extremamente rápido. Para isso, ele usa um mecanismo proprietário de restrições. Escolhemos essas ferramentas porque (1) as licenças permitem que sejam executadas e comparadas; (2) são mecanismos semânticos, não linters (como o ESLint); (3) são ferramentas comuns e amplamente utilizadas; e (4) temos no teste tanto uma ferramenta executada localmente quanto uma SaaS.
A velocidade é essencial para que uma solução SAST seja fácil de usar pelos desenvolvedores. É amplamente reconhecido que os desenvolvedores são mais eficientes quando os problemas de segurança são identificados durante o desenvolvimento, para que possam ser resolvidos antes de o código ser enviado. O código ainda está fresco na memória. O Snyk Code oferece plugins para IDE que se integram perfeitamente ao fluxo de trabalho dos desenvolvedores. Além disso, apresenta diagramas de fluxo de dados fáceis de entender e explicações detalhadas, com exemplos de correções usadas em bibliotecas de código aberto no mesmo contexto. Mas, para este teste, nosso foco foi a velocidade.
Para realizar o teste, executamos uma varredura em cada repositório: SonarQube localmente, e LGTM e Snyk Code como serviços SaaS. Como mencionado acima, isso influenciou a escolha dos repositórios, pois não queríamos que os tempos de varredura dependessem da largura de banda da rede.
Também escolhemos repositórios de código aberto usados no mundo real, em vez de benchmarks, pois o objetivo era simular o que os desenvolvedores fazem de verdade. Comparar ferramentas SAST usando benchmarks tem seus próprios problemas e, neste caso, não ajudaria no nosso objetivo.
Resultados do teste
Abaixo estão os valores estatísticos gerais (arredondados) do tempo de varredura, em segundos. (n=48, arredondado para o inteiro mais próximo):
Média | Máximo | Mínimo | Percentil 5 | Percentil 95 | Mediana | desvio padrão | |
|---|---|---|---|---|---|---|---|
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 |
Veja os resultados em um gráfico de dispersão (quanto menor, melhor; escala logarítmica; feito com R e ggplot2):

O eixo logarítmico exagera a dispersão na faixa inferior. Na realidade, o desvio padrão do Snyk Code é muito menor que o do SonarQube, por exemplo.
Abaixo está um gráfico de caixa dos valores (quanto menor, melhor; usamos uma escala logarítmica para incluir todos os valores no gráfico; feito com R e ggplot2; mediana e média indicadas):

O gráfico mostra claramente que, na maioria dos casos, o Snyk é muito mais rápido que qualquer uma das outras duas ferramentas. A mediana do Snyk é de 6,7 vezes (SonarQube) a 16,4 vezes (LGTM) mais rápida, o que mostra que os resultados não dependem de alguns valores atípicos excepcionalmente bons, mas refletem uma tendência geral.
No diagrama acima, chama atenção a dispersão dos valores na coluna do LGTM. Os tempos variam de cerca de 2 minutos (razoável) a mais de 17 minutos (inaceitável). Os desenvolvedores não vão esperar vários minutos pelos resultados durante o expediente. Felizmente, a mediana do LGTM é de cerca de 3 minutos.
Ao comparar com nosso primeiro teste de velocidade (na época, como DeepCode; agora, Snyk Code), notamos uma grande melhoria de desempenho, pois otimizamos significativamente o carregamento no serviço de nuvem nos últimos meses. Desta vez, o SonarQube também foi mais rápido, provavelmente porque usamos um computador mais potente, com maior capacidade de paralelismo que no primeiro teste.
Outra observação interessante é que, do ponto de vista da velocidade, os mecanismos SaaS e os instalados localmente não são tão diferentes.
Suposições e limitações
Escolhemos o SonarQube (Community Edition 8.9.1) e o LGTM porque as licenças permitem essas comparações e porque são ferramentas amplamente utilizadas.
Escolhemos 48 repositórios JavaScript de médio porte, pois esse cenário de teste parece refletir o trabalho típico dos desenvolvedores. A amostra foi selecionada aleatoriamente entre os cerca de 200 mil repositórios mais populares do GitHub, classificados por estrelas. O tamanho do código não foi um critério.
Forçamos uma varredura completa e não usamos um mecanismo de varredura diferencial. Por exemplo, no caso do Snyk Code em plugins de IDE, após a varredura inicial, o plugin faz varreduras diferenciais e economiza largura de banda.
Usamos um Intel Xeon a 2 GHz, com 16 núcleos e 64 GB de RAM.
Proteja seu código com inteligência de ponta
Conheça toda a gama de recursos de análise estática (SAST) do Snyk Code em apenas 30 minutos.
Dados brutos
Também queremos disponibilizar os dados brutos para que você possa aplicar suas próprias análises estatísticas. (Tempos em segundos)
Repositório | 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 |