Rules


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.

Regola semgrep per XSS example2.php di WFP


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à.


Definizione del pattern

Le caratteristiche del frammento di codice da catturare sono:

  1. lettura in input di una variabile
  2. rimozione statica della stringa script tramite la funzione pgrep_replace()
  3. riflessione dell’input scarsamente sanitizzato
$VAR = $_GET["..."];
...
$VAR = preg_replace("=~/\\/<script>\\//", "", $VAR);
...
echo $VAR;

=~/STRING/ match di una espressione regolare.


Collaudo del pattern

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;'

File YAML di regole

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.