Hooks

Hook interpreter: señala sinks de ejecución dinámica de código

Analiza un proyecto en busca de sinks de ejecución dinámica de código en varios lenguajes, o evalúa un único fragmento de código, desde la línea de comandos.

El hook interpreter señala sinks de ejecución dinámica de código: construcciones que convierten datos en código que se ejecuta o que se los pasan a una shell, desde eval hasta la deserialización nativa. Tiene en cuenta el lenguaje, ya que lee cada archivo según sus propias reglas. Es el motor determinista en el que se apoya la especialización interpreter, y puedes ejecutarlo tú mismo en modo scan o check.

Cómo ejecutarlo​

npx lagune read interpreter # scans the whole project
npx lagune read interpreter --dir src # scans a directory
npx lagune read interpreter --file app.py # scans a single file

Estos sinks son de doble uso: un análisis estático no puede decidir si una entrada influida por un atacante llega a alguno de ellos, así que cada coincidencia es una advertencia que revisar, nunca un hallazgo confirmado. El análisis muestra una única sección, Dynamic-execution sinks to review, agrupada por archivo. Si no encuentra nada, muestra no dynamic-execution sinks found.

¡Lee el código señalado, nunca lo ejecutes!

Estudia cada sink de forma estática, rastreando si una entrada no fiable llega hasta él. Nunca ejecutes ni pases por eval el código señalado, ni ningún código remoto o descargado en tiempo de ejecución que este cargue, para "probar" lo que hace.

Cómo interpretar el veredicto​

VeredictoSignificado
carefulEl fragmento contiene un sink de ejecución dinámica propio de su lenguaje. Revísalo leyéndolo, nunca ejecutándolo.
safeNo se ha encontrado ningún sink de ejecución dinámica para el lenguaje indicado.

Opciones de la CLI​

OpciónValorDescripción
--patternun fragmento de códigoComprueba un fragmento. Repítela para comprobar varios, con un veredicto por línea.
--langun lenguajeObligatoria con --pattern: uno de javascript, python, php, ruby, java, kotlin, go, rust, c, cpp, csharp.
--dirun directorioLimita el análisis a un directorio. Se puede repetir y combinar con --file.
--fileun archivoLimita el análisis a un solo archivo. Se puede repetir y combinar con --dir.

Sin ninguna opción, analiza todo el proyecto. --pattern necesita --lang y no se puede combinar con --dir ni con --file.

Lenguajes compatibles​

El análisis lee estos lenguajes, identificados por la extensión del archivo, y comprueba cada uno con su propio conjunto de sinks de ejecución dinámica.

#LenguajeExtensionesSinks que señala
1JavaScript / TypeScript.js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .rioteval(), constructor Function, setTimeout/setInterval con el cuerpo en una cadena, módulo vm, exec de child_process, require() dinámico, import() dinámico
2Python.py, .pyieval/exec, __import__(), os.system/os.popen, subprocess shell=True, pickle.load/loads, yaml.load (inseguro)
3Ruby.rbfamilia eval (instance_eval/class_eval/module_eval/eval), system/exec, comillas invertidas o %x, Kernel#open / IO.popen/read/binread / Open3, Process.spawn, Marshal.load
4Go.goexec.Command/exec.CommandContext, plugin.Open
5PHP.phpeval(), assert() sobre una cadena, create_function(), ejecución en shell (system/exec/shell_exec/passthru/popen/proc_open), call_user_func/call_user_func_array, include/require con una ruta construida en tiempo de ejecución
6Rust.rsCommand::new, process::Command
7Java.javaRuntime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
8Kotlin.kt, .ktsLos sinks de la JVM: Runtime.exec, ProcessBuilder, ScriptEngine, ObjectInputStream.readObject
9C#.csProcess.Start / new Process, BinaryFormatter, Assembly.Load
10C.c, .hsystem(), popen(), la familia exec* (execl, execve, execvp, …)
11C++.cc, .cpp, .cxx, .hpp, .hh, .hxxsystem(), popen(), la familia exec* (execl, execve, execvp, …)
Orientativo, no exhaustivo

Lee el código fuente como texto, así que se le puede escapar un sink construido en tiempo de ejecución, oculto tras un alias o escrito de una forma que no reconoce. Toma la tabla como un buen punto de partida, no como un inventario completo.

consejo

El hook garantiza el mínimo (que estos sinks existen y dónde están): decidir si un valor no fiable llega realmente a alguno es la cuestión de criterio que cubre la especialización interpreter.

Preguntas frecuentes

No. Señala los sinks de ejecución dinámica como advertencias que revisar, nunca como hallazgos confirmados, porque un análisis estático no puede decidir si una entrada influida por un atacante llega al sink.

Lee los lenguajes de la tabla de lenguajes compatibles, identificados por la extensión del archivo, y comprueba cada uno con su propio conjunto de sinks. Los demás lenguajes no producen ningún sink.