
Repositorio curado de reglas Semgrep para GitLab SAST, que proporciona patrones de análisis estático para detectar vulnerabilidades de seguridad en múltiples lenguajes de programación con integración CI/CD.
Este es el repositorio central de reglas de Semgrep que alberga las reglas de Semgrep para el analizador Semgrep de GitLab.
El repositorio está estructurado de la siguiente manera:
.
├── mappings
│ ├── find_sec_bugs.yml
│ ├── eslint.yml
│ └── ...
├── rules
│ ├── lpgl
│ │ ├── java
│ │ │ ├── webview
│ │ │ │ ├── rule-ignore_ssl_certificate_error.yml
│ │ │ │ ├── rule-ignore_ssl_certificate_error.java
│ │ │ │ └── ...
│ │ │ └── ...
│ │ ├── python
│ │ │ └── ...
│ │ └── ...
│ ├── lpgl-cc
│ │ ├── java
│ │ │ └── ...
│ │ └── ...
│ └── ...
├── c
│ ├── buffer
│ │ ├── rule-strcpy.yml
│ │ ├── test-strcpy.c
│ │ ├── rule-memcpy.yml
│ │ └── test-memcpy.c
│ └── ...
└── javascript
│ └── ...
└── ...
La estructura anterior sigue el patrón:
rules/<license>/<language>/<ruleclass>/rule-<rulename>\.(yml|<ext>)
donde:
<license> es la licencia de todas las reglas debajo<language> el lenguaje de programación objetivo<ruleclass> un nombre descriptivo para la clase de reglas debajo<rulename> un nombre descriptivo para la regla real<ext> la extensión de archivo habitual para <language>Las reglas antiguas siguen el patrón <language>/<ruleclass>/rule-..., y se debe preferir el nuevo patrón de arriba siempre que sea posible.
El directorio mappings incluye la configuración del paquete de reglas.
El Makefile define algunos objetivos que son útiles al trabajar con reglas:
$ make help
TARGETS:
test test all rules with Semgrep
watch watch for file changes and auto-run affected tests
help prints this message
Las reglas contenidas en este repositorio deben adherirse al siguiente formato:
" para cadenas, de lo contrario bloque literal YAML |---El directorio de mappings en este repositorio contiene archivos de configuración YAML que mapean los identificadores de analizadores nativos (p. ej. Bandit, Brakeman, etc.) a las reglas de Semgrep correspondientes.
La intención de los archivos de mapeo es, ante todo, separar la información específica del analizador de las reglas reales y, en segundo lugar, proporcionar una forma no intrusiva de generar paquetes de reglas o conjuntos de reglas (a través de límites de lenguaje o analizador) para diferentes propósitos.
Los archivos de mapeo se encuentran en el directorio mappings/, donde el nombre del archivo se refiere al paquete de reglas y/o analizador representado por el conjunto de reglas utilizado en el archivo respectivo. Si desea que las reglas se incluyan en el conjunto de reglas estándar de GitLab y la regla no encaja en ninguno de los paquetes de reglas (o analizadores) ya disponibles en el directorio mappings/, puede agregar sus mapeos al archivo mappings/gitlab_<license>_<language>.yml, donde <license> es una licencia adecuada dictada por la fuente de la que proviene la regla y <language> es un marcador de posición para el lenguaje al que se refiere la regla.
Si desea integrar una nueva regla que fue desarrollada desde cero, puede agregar un mapeo correspondiente al archivo mappings/gitlab_ee_<language>.yml.
Al determinar qué licencia debe aplicarse a una regla particular que está mapeando, consulte esta guía interna.
Los mapeos también se utilizan para ensamblar automáticamente paquetes de reglas. El fragmento a continuación ilustra un ejemplo con archivos de mapeo para el analizador bandit. La sección native_id incluye información sobre el identificador del analizador nativo, es decir, metainformación que el analizador original (en este caso bandit) adjunta al hallazgo que produce. Los mapeos de reglas reales se definen en la sección mappings. Cada mapeo asigna un identificador de regla de analizador nativo (en el ejemplo a continuación B301) a un conjunto de archivos de semgrep en este repositorio que se asemejan, o idealmente son de facto equivalentes, a esa regla nativa en particular.
bandit:
native_id:
type: "bandit_test_id"
name: "Bandit Test ID: $ID"
value: "$ID"
mappings:
- id: "B301"
rules:
- path: "python/deserialization/rule-pickle"
primary_id: "bandit.B301-1"
id: "bandit.B301-1"
- path: "python/deserialization/rule-cpickle"
primary_id: "bandit.B301-2"
id: "bandit.B301-2"
- path: "python/deserialization/rule-dill"
primary_id: "bandit.B301-3"
id: "bandit.B301-3"
- path: "python/deserialization/rule-shelve"
primary_id: "bandit.B301-4"
id: "bandit.B301-4"
# ...
La anatomía de un archivo de mapeo se explica con más detalle a continuación.
gl-sast-report.json) con fines de deduplicación.gl-sast-report.json producido por el analizador Semgrep de GitLab y estará disponible en el Informe de Vulnerabilidades.B301 que se refiere a una de las reglas del analizador de python bandit). El array rules apunta a archivos en el repositorio a los que se refiere esta regla. En otras palabras, la lógica de B301 está implementada en los cuatro archivos listados en el fragmento anterior.Usamos dos tipos diferentes de identificadores id y primary_id para soportar la división de reglas: múltiples reglas de semgrep (id) pueden ser mapeadas a una sola regla de analizador nativo (primary_id).
Las reglas y casos de prueba en este repositorio provienen parcialmente de las fuentes listadas a continuación:
Los detalles se listan en los encabezados de todos los archivos de reglas y pruebas, incluyendo la información de licencia y la atribución correspondiente.
Si conoces un patrón que no está presente en este repositorio o refinamientos que podrían aplicarse a las reglas de este repositorio, puedes contribuir abriendo un issue, o incluso enviar una mejora a los archivos de reglas/casos de prueba en este repositorio.
Aplicamos el siguiente esquema de versionado semántico a este repositorio:
Las nuevas versiones de reglas SAST deben incorporarse al analizador semgrep para que surtan efecto. Para solicitar una nueva versión de semgrep, cree un issue de release siguiendo las instrucciones en la plantilla de issue de release de SAST.
Queremos agradecer mucho a los siguientes autores por sus valiosas contribuciones.
| Autor | MRs/Issues |
|---|---|
| @masakura | !99, !107 |
| @niklas.volcz | !183 |
| @pieter39 | !668 |