\documentclass[14pt]{article}
\usepackage{hyperref}
\title{Analyse statique de code avec Semgrep}
\author{\href{mailto:claudio@r2c.dev}{Claudio Merloni}}
\setcounter{tocdepth}{3}
\begin{document}

\maketitle
\tableofcontents

\section{Analyse statique de code avec Semgrep}

\subsection{Présentation de l'outil}
Semgrep est un outil d'analyse statique de code. Il permet de rechercher des motifs dans le code source, codifiés dans des règles avec une syntaxe simple et intuitive.
Ces règles peuvent être écrites par l'utilisateur ou être issues de la communauté (voir liens dans les sections suivantes).

Semgrep est capable de rechercher des patterns dans plusieurs langages de programmation, dont Python, Java, C, C++, C\#, Go, JavaScript, PHP, Ruby, TypeScript, YAML,
JSON, HTML, Markdown, Dockerfile, Bash, et bien d'autres (\href{https://semgrep.dev/docs/supported-languages/}{Supported Languages}).

Semgrep peut être utilisé pour identifier des vulnérabilités de sécurité, des anti-patterns, des bugs, des erreurs de configuration, des problèmes de performance, etc.
Il peut aussi permettre de s'assurer que le code respecte des règles de codage propres à une entreprise ou à une équipe.

Semgrep mets à disposition une analyse sémantique du code source, une analyse de dataflow, la possibilité d'extraire et analyser du code intégré dans d'autres fichiers
(p.ex. JavaScript dans un fichier HTML), etc. tout en restant rapide et simple d'utilisation.

Semgrep est disponible en ligne de commande et peut être intégré dans des pipelines de CI/CD.

\subsection{Code source et documentation}
Le code source de Semgrep est disponible sur GitHub à l'adresse suivante : \href{https://github.com/returntocorp/semgrep}{Semgrep GitHub repository}.
Les règles issues de la communauté de Semgrep sont disponibles sur GitHub à l'adresse suivante : \href{https://github.com/returntocorp/semgrep-rules}{Semgrep GitHub rules repository}.
La documentation de Semgrep est disponible à l'adresse suivante : \href{https://semgrep.dev/docs}{Semgrep Documentation}.

\subsection{Installation}
La façon la plus simple d'installer Semgrep est de l'installer à partir de la ligne de commande avec la commande suivante.

\subsubsection{Linux, macOS et Windows Subsystem for Linux (WSL)}
\begin{verbatim}
$ python3 -m pip install semgrep
\end{verbatim}

\subsubsection{macOS}
\begin{verbatim}
$ brew install semgrep
\end{verbatim}

\subsubsection{Docker}
\begin{verbatim}
$ docker run --rm -v "${PWD}:/src" \
  returntocorp/semgrep semgrep --config=auto
\end{verbatim}

Pour plus d'informations sur l'installation et l'usage de Semgrep, voir la documentation : \href{https://semgrep.dev/docs/getting-started/}{Semgrep Installation}.
Pour compiler Semgrep depuis le code source, voir la documentation : \href{https://semgrep.dev/docs/developing-locally/}{Semgrep Development}.

\subsection{Informations supplémentaires}

\begin{itemize}
  \item \href{https://github.com/returntocorp/semgrep}{Semgrep Source Code}
  \item \href{https://github.com/returntocorp/semgrep-rules}{Semgrep Community Rules}
  \item \href{https://semgrep.dev/docs}{Semgrep Documentation}
  \item \href{https://semgrep.dev/learn}{Semgrep Tutorial}
  \item \href{https://semgrep.dev/explore}{Semgrep Rules Registry}
  \item \href{https://semgrep.dev/playground}{Semgrep Playground}
  \item \href{https://go.semgrep.dev/slack}{Semgrep Community Slack}
  \item \href{https://www.youtube.com/watch?v=YK4pTzQb53U&t=1577s}{Semgrep Summer Meetup 2022: Life of a Rule and Roadmap sneak peek!}
\end{itemize}

\section{Plan de la présentation}
La présentation va s'articuler de la façon suivante :
\begin{itemize}
  \item Introduction à Semgrep OSS
  \subitem Principes de conception
  \subitem Architecture et types d'analyse
  \subitem Premiers pas
  \subitem Alternatives
  \item Semgrep pour identifier des vulnérabilités de sécurité
  \item Semgrep pour faire respecter des règles de codage securisée
\end{itemize}

\section{Support de présentation}

La présentation est disponible au lien suivant: \href{https://bit.ly/semgrep_sstic2023}{Semgrep SSTIC 2023}.

\section{Aperçu de la présentation}

Ce qui suit n'est qu'un aperçu des sujets traités dans la présentation. Le contenu complet est disponible dans le support de présentation et dans la documentation de Semgrep.

\subsection{Introduction à Semgrep OSS}
Semgrep est un outil d'analyse statique pour plusieurs langages de programmation qui peut trouver différentes variantes de bug en identifiant des motifs qui ressemblent à du code source. L'équipe Semgrep a établi des principes de conception pour guider son développement, qui incluent la gratuité de l'outil, l'ouverture de son code source, sa rapidité, et sa capacité à prendre en charge tous les langages de programmation. Semgrep est également conçu pour être facile à utiliser, adaptable, convivial pour les débutants, et permet de créer des fichiers de règles facilement compréhensibles.

L'outil est optimisé pour fonctionner dans l'IDE, les hooks git commit, ou CI, et l'équipe encourage les commentaires et les contributions de la communauté pour rendre Semgrep encore plus efficace pour l'analyse statique.

Semgrep prend en charge plus de 30 langages, dont C, C++, C\#, Go, Java, JavaScript, Kotlin, PHP, Python, Ruby, Rust et TypeScript, et bien d'autres encore. L'analyse syntaxique est basée sur la bibliothèque open source tree-sitter. Le moteur de Semgrep est conçu pour être indépendant du code source d'écriture, l'équipe travaille à ajouter la prise en charge de nouveaux langages, et les contributions de la communauté sont les bienvenues (et frequentes!).

La support de plusieurs modes d'analyse permettent à Semgrep d'être utilisé à des fins différentes. Le mode par défaut est appelé mode \texttt{search}, qui est conçu pour identifier des éléments de code qui correspondent aux motifs definis dans les règles. Le mode \texttt{search} est utile pour trouver des bugs, appliquer des normes de codage, effectuer une revue de code ou simplement explorer une base de code inconnue.

Une analyse sémantique et du "dataflow" permettent de trouver des bugs complexes sans sacrifier la simplicité des règles, en abstrayant la complexité du langage sous-jacent: compréhension de la façon dont les symboles sont importés, comment les constantes se propagent à travers le code, etc.

Semgrep peut également être utilisé en mode \texttt{taint}, qui permet une analyse de type "taint tracking" intra-procédurale. Les règles de Semgrep peuvent être utilisées pour définir des motifs pour les "sources", les "sinks", les "sanitizers" et les "propagators" de taint. Ce mode est utile pour trouver des vulnérabilités de sécurité telles que SQL Injection, Cross-Site Scripting, Command Injection, etc.

\subsection{Identifier des vulnérabilités de sécurité}

Dans cette section, nous allons voir comment ces règles peuvent permettre d'identifier des vulnérabilités de sécurité.

Nous allons nous concentrer sur quatre ou cinq catégories de vulnérabilités de sécurité courantes, comme par exemples:

\begin{itemize}
  \item{Hardcoded secrets}
  \item{XXE}
  \item{SQL injection}
  \item{Cross-site scripting}
\end{itemize}

L'objectif est de montrer comment Semgrep peut être utilisé pour identifier ces vulnérabilités de sécurité, et les fonctionnalités des règles qui peuvent être utilisées pour y parvenir.

Les vulnérabilités ont été chosies pour, à la fois présenter des cas pratiques, illustrer les éléments principaux de la syntaxe des règles, et montrer comment les différents modes d'analyse de Semgrep peuvent être utilisés.

\subsection{Faire respecter des règles de codage securisé}

Nous sommes en train de vivre une évolution significative dans la manière dont les équipes de sécurité opèrent et accordent leurs budgets et leur temps, limités. Historiquement, notre secteur d'activité a axé ses efforts sur la création d'outils pour identifier les vulnérabilités. Bien que nous ayons développé des outils impressionnants, ces approches n'ont pas réussi à relever les défis auxquels sont confrontées les équipes d'ingénieurs modernes. Ces outils sont souvent trop lents, nécessitent un investissement temps trop important de la part des équipes sécurité, une expertise considerable pour être réglés, submergent les utilisateurs de faux positifs et surtout, ne relèvent finalement pas le niveau de sécurité d'une entreprise. Il existe, en revanche, une approche alternative: au lieu d'investir dans la découverte de plus de bugs, les équipes de sécurité peuvent se concentrer sur l'adoption de règles de sécurité par défaut ("guard rails"). Lorsque cela est fait correctement, en combinant des pratiques de développement sécurisé et une analyse statique "légère" orientée à vérifier des "invariants", les équipes de développement peuvent éviter des classes entières de vulnérabilités , sans devoir jouer à la chasse aux vulnérabilités.

Des exemples de règles de sécurité qui peuvent être implémentées avec Semgrep incluent:

\begin{itemize}
\item{Vérifier l'adoption de fonctionnalités de masquage des données sensibles}
\item{Identifier des fonctionnalités de debuggage qui ne doivent pas être utilisées en production}
\item{Vérifier que tous les points d'entrée d'une application web sont protégés par un mécanisme d'authentification}
\end{itemize}

\end{document}