In this article
¿Puede el aprendizaje automático detectar vulnerabilidades de path traversal en Go? ¡Snyk Code sí puede!
¿A quién no le gusta un buen desafío de seguridad? A mí sí, pero ¿crees que un algoritmo de aprendizaje automático puede detectar vulnerabilidades de path traversal? ¡Pongámoslo a prueba!
En las últimas semanas, Zeyad AbuLaban compartió una serie de publicaciones sobre código seguro y vulnerabilidades de seguridad. En su serie “Secure Code Quest”, presenta vulnerabilidades de distintos tipos y en diferentes lenguajes.
Cuando Zeyad publicó su Secure Code Quest #5, en vez de ir directo al código de la imagen para intentar detectar patrones inseguros, se me ocurrió otra cosa: «Si pego este código de Go en mi IDE y lo analizo con mi extensión de Snyk para VS Code, ¿podrá detectarlo?»

¿Este código de Golang es vulnerable o no?
Empecemos por organizar el código del programa de Go en un formato claro para inspeccionarlo a fondo durante una revisión de código adecuada.
Este programa de Golang trabaja con archivos y, por eso, incluye una función downloadHandler() que actúa como controlador HTTP. Espera recibir un filename en el parámetro de consulta, limpiar la ruta y aplicar medidas de seguridad. Luego, construye una ruta de archivo a una carpeta de almacenamiento en el disco (baseDir := “public/files/”) al concatenar el nombre del archivo con un directorio raíz.
package main
import (
// ... imports ...
)
func main() {
// ... main function code ...
}
func downloadHandler(w http.ResponseWriter, r *http.Request) {
filename := r.URL.Query().Get("filename")
if filename == "" {
http.Error(w, "Missing filename parameter", http.StatusBadRequest)
return
}
// Preventing Path Traversal
sanitizedFilename := strings.Replace(filename, "../", "", -1)
cleanedFilename := filepath.Clean(sanitizedFilename)
baseDir := "public/files/"
fullPath := filepath.Join(baseDir, cleanedFilename)
// ... code to handle file serving ...
}¿Cómo implementa controles de seguridad este programa de Go? Usa lógica de reemplazo de cadenas para sustituir todas las instancias de ../ en un nombre de archivo por una cadena vacía y, en esencia, eliminarlas por completo de la entrada proporcionada por el usuario.
Imaginemos la siguiente solicitud HTTP:
curl "http://localhost:8080/download?filename=../../app/flag.txtEsta solicitud HTTP hará que se eliminen todas las rutas ../ de la variable filename, por lo que la entrada filename quedará únicamente como app/flag.txt. Luego, se combinará con la ruta baseDir, y la ruta completa será public/files/app/flag.txt.
Entonces, ¿cómo podrías evadirlo?
¿Cómo crearías la solicitud HTTP para obtener la bandera /app/flag.txt del desafío Capture the Flag y ganar el premio?
Antes de revelar el payload, veamos qué ocurre cuando pegas este programa de Golang en el IDE.
Protección del código con aprendizaje automático
Primero, agregué esta lógica como parte de una ruta nueva en mi aplicación web, que usa Gin. Por eso, aquí ves una declaración de ruta un poco diferente. Luego, puedes ver que completé el código después de la variable fullPath para verificar que el archivo sea válido y, por último, enviarlo al cliente.

Ahora imagina que tienes la extensión de Snyk instalada en el IDE.
Solo tienes que guardar el archivo y, unos segundos después (sí, de verdad, solo unos segundos), obtendrás una auditoría de seguridad del código que analiza tu código fuente (incluidas las dependencias, el Dockerfile, Terraform, etc.).
Además de proporcionarte un informe de seguridad, la extensión de Snyk para IDE también resalta la línea de código vulnerable, como lo haría un linter, para llamar tu atención. Además, te brinda más herramientas para profundizar en el problema de seguridad:
El nombre y los detalles de la vulnerabilidad de seguridad.
El flujo de datos de origen a destino muestra cómo los datos sin sanear llegan a las API sensibles.
Obtén más información sobre esta vulnerabilidad de path traversal si es la primera vez que oyes hablar de ella.
Te muestra ejemplos de código para corregirla que puedes aplicar si no sabes cómo solucionar esta vulnerabilidad.
En algunos casos, Snyk también ofrece Snyk Agent Fix para resolver automáticamente el problema de seguridad refactorizando el código y eliminando la vulnerabilidad sin alterar tu lógica.

¿Qué tiene que ver el aprendizaje automático con esto? Pues, todo.
SAST de Snyk (pruebas estáticas de seguridad de aplicaciones) analiza tu código fuente y luego lo procesa con el motor de aprendizaje automático patentado de Snyk. Este motor de seguridad se basa en un sólido algoritmo de IA simbólica, entrenado con grandes bases de código, que aprendió a reconocer patrones de código inseguro clasificados y etiquetados por expertos en seguridad durante un proceso de ajuste fino.
Este sofisticado proceso técnico se ejecuta en segundos, directamente en mi IDE, y ofrece una velocidad y precisión inigualables para detectar vulnerabilidades de seguridad en mi código. El motor también se entrenó con ejemplos de código seguro y analizó correcciones reales de seguridad en repositorios de código abierto para sugerirme diferencias de código con ejemplos corregidos que puedo aplicar si no tengo claro cómo implementar una corrección de seguridad.
La combinación de algoritmos de aprendizaje automático generativo e IA simbólica contribuye a que Snyk ofrezca una experiencia sumamente eficaz para detectar vulnerabilidades en el código. Obtén más información sobre cómo Snyk garantiza la adopción segura de la IA.
Explotar Golang para hacer path traversal
Bien, volvamos a nuestro desafío de seguridad. ¿Cómo explotamos el path traversal en el programa de Golang que vimos y capturamos la bandera?
Como recordatorio, esta es la lógica de prevención de path traversal del programa de Golang:
// Preventing Path Traversal
sanitizedFilename := strings.Replace(filename, "../", "", -1)
cleanedFilename := filepath.Clean(sanitizedFilename)La lógica de reemplazo de cadenas busca coincidencias con el texto ../. Esto significa que, si el nombre del archivo contiene la secuencia clásica de path traversal, como “../”, esta se reemplazará.
Sin embargo, ¿qué ocurre si modificamos el texto de path traversal para evadir la lógica de coincidencia exacta? Considera el siguiente payload HTTP con la entrada filename modificada:
curl "http://localhost:8080/download?filename=....//....//app/flag.txtCuando el valor de la cadena de consulta filename pasa a ser ....//....//app/flag.txt,, se encuentran y eliminan las apariciones de “../” (que están dentro de la cadena del nombre de archivo). Esto deja los caracteres “..” restantes y la única “/” del nombre de archivo. Como resultado, el valor de sanitizedFilename queda como ../../app/flag.txt y sale del directorio base (public/files/) para enviar el archivo flag.txt al cliente.
¡Compite en Fetch the Flag 2026!
Pon a prueba tus habilidades de seguridad en nuestro evento Capture the Flag, del 12 al 13 de febrero, de 12 p. m. ET a 12 p. m. ET.