Pattern → espressione che rappresenta un frammento di codice all’interno di un programma.
Ellissi ... → match di un quantitativo arbitrario di codice (anche zero)
Ellissi stringa "..." → match di una qualunque stringa (anche nulla)
Metavariabile $VAR → match di un quantitativo arbitrario di codice e lo memorizza (es. nome_variabile = ). Si può poi riusare (nome_variabile.close())
Regole → File YAML contenente una serie di pattern
rules:
- id: subprocess-call
message: This captures a specific toxic pattern.
languages: [php]
severity: ERROR
<ELENCO DI PATTERN DA VERIFICARE>
Pattern sono composti in OR, NOT e AND logico.
pattern-either, ORpattern-not, NOTpatterns, ANDpattern-inside, cerca il pattern dentro un altro frammento (direi debba essere messo in AND e il secondo pattern verrà cercato dentro a pattern-inside)Il codice sorgente è:
<?php require_once '../header.php'; ?>
Hello
<?php
$name = $_GET["name"];
$name = preg_replace("/<script>/","", $name);
$name = preg_replace("/<\\/script>/","", $name);
echo $name;
?>
<?php require_once '../footer.php'; ?>
Lo script verifica la presenza del tag <script> ma è possibile aggirare il controllo ed eseguire codice Javascript in diversi modi, ad esempio:
<img src=x onerror=alert(1)>
Tale vulnerabilità non viene rilevata da semgrep nemmeno con il set di regole p/xss.
Si scrive dunque una regola custom per rilevare tale vulnerabilità.
Le caratteristiche del frammento di codice da catturare sono:
script tramite la funzione pgrep_replace()$VAR = $_GET["..."];
...
$VAR = preg_replace("=~/\\/<script>\\//", "", $VAR);
...
echo $VAR;
=~/STRING/ match di una espressione regolare.
Per collaudare il pattern si usa l’opzione -e di semgrep.
semgrep scan -l php -e '$VAR = $_GET["..."]; ... $VAR = preg_replace("=~/\\/<script>\\//", "", $VAR); ... echo $VAR;'
Si crea il file YAML contenente le regole:
rules:
- id: xss-example2
message: Find XSS in PHP.
languages: [php]
severity: ERROR
patterns:
- pattern: |
$VAR = $_GET["..."];
...
$VAR = preg_replace("=~/\\/<script>\\//", "", $VAR);
...
echo $VAR;
E lo si può utilizzare come file di config:
semgrep scan --config=xss-example2.yml
Ora siamo in grado di trovare in pattern tossico.