Com a aquisição da startup Semmle, o GitHub visa tornar a detecção contínua de vulnerabilidades parte do serviço de integração e implantação contínua.
Anunciando a aquisição, Nat Friedman, CEO do GitHub, escreveu:
O revolucionário mecanismo de análise de código semântico da Semmle permite que os desenvolvedores escrevam consultas que identificam padrões de código em grandes repositórios de código e pesquisem vulnerabilidades e problemas de segurança.
A Semmle criou a LGTM, uma plataforma de análise de código contínua destinada a identificar vulnerabilidades nos sistemas de software. No coração da LGTM, está o Semmle QL, um mecanismo de pesquisa de código e linguagem de consulta que permite que a análise de código encontre e resolva as vulnerabilidades de segurança.
O QL usa análise de variantes, uma técnica que os engenheiros de segurança geralmente usam para identificar vulnerabilidades a partir de uma já conhecida que é tratada como uma semente para o processo de pesquisa. Em outras palavras, depois que uma vulnerabilidade é identificada por meio de um teste de penetração, por exemplo, os pesquisadores de segurança auditam o restante da base de código para encontrar problemas semelhantes. Esse é o processo que o QL automatiza e se estende por vários blocos de código, permitindo que os desenvolvedores escrevam consultas que podem ser compartilhadas e reutilizadas. Segundo a Semmle, as soluções foram usadas para identificar milhares de vulnerabilidades, incluindo mais de 100 CVEs em projetos de código aberto.
Um recurso importante do mecanismo de análise Semmle é tratar o código como dados no nível AST, e não como texto no qual operamos usando expressões regulares. Este é um exemplo de como podemos analisar uma função C que itera sobre uma matriz passada como argumento e garante que a matriz de comprimento suficiente seja passada em cada chamada:
import cpp
from Function f, FunctionCall c, int i, int a, int b
where f = c.getTarget()
and a = c.getArgument(i).getType().(ArrayType).getArraySize()
and b = f.getParameter(i).getType().(ArrayType).getArraySize()
and a < b
select c.getArgument(i), "Array of size " + a
+ " passed to $@, which expects an array of size " + b + ".",
f, f.getName()
No trecho anterior, f
é a função, c
a chamada da função, i
é um número inteiro usado para iterar sobre os argumentos da chamada, a
e b
são usados para armazenar o tamanho esperado e o tamanho real da matriz. O seguinte trecho visa garantir que todos os campos públicos de uma classe sejam declarados como finais:
from Field f
where f.hasModifier("public")
and
not(f.hasModifier("final"))
select f.getDeclaringType().getPackage(),
f.getDeclaringType(),
f
Como podemos observar, a sintaxe da QL é declarativa, um pouco parecida com o SQL, e orientada a objetos. Atualmente, o Semmle suporta C e C++, C#, COBOL, Java, JavaScript, TypeScript e Python. O suporte ao Go está sendo desenvolvido.
O Semmle QL não é um produto novo e foi usado por grandes empresas, diz a Semmle, incluindo Uber, NASA, Microsoft e Google. Isso contribuiu para a construção de uma grande biblioteca de consultas QL. De acordo com a Semmle, os desenvolvedores podem reutilizar milhares de consultas de código aberto e executá-las como parte dos pipelines de IC automáticos sempre que enviarem uma nova solicitação de recebimento.
Atualmente, o Semmle QL pode ser usado através do LGTM, que pode se conectar à conta do GitHub, mas a empresa planeja torná-lo parte integrante do serviço de CI/CD por meio do GitHub Actions.