--- name: scan_secrets_in_dirty kind: function lang: bash domain: cybersecurity version: "1.0.0" purity: impure signature: "scan_secrets_in_dirty(repo_dir: string) -> stdout: matched paths" description: "Para un repo git, lista archivos modificados/nuevos cuyo nombre matchee patron de secret. Patrones: .env, credentials, .key, .pem, id_rsa, secret, token*.txt. Stdout vacio si no hay matches. Exit 0 siempre que el repo exista." tags: [git, secrets, security, scan, credentials, cybersecurity] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [] params: - name: repo_dir desc: "path al repo git a escanear; default '.'" output: "paths sospechosos por stdout (uno por linea), vacio si todo limpio; exit 1 solo si repo_dir no es un repo git" tested: false tests: [] test_file_path: "" file_path: "bash/functions/cybersecurity/scan_secrets_in_dirty.sh" --- ## Ejemplo ```bash source bash/functions/cybersecurity/scan_secrets_in_dirty.sh # Escanear repo actual matches=$(scan_secrets_in_dirty .) if [[ -n "$matches" ]]; then echo "ABORTAR: archivos sospechosos detectados:" echo "$matches" exit 1 fi # Escanear repo especifico scan_secrets_in_dirty $HOME/fn_registry ``` ## Patrones detectados - `.env`, `.env.local`, `.env.production`, etc. - `*credentials*` - `*.key` - `*.pem` - `id_rsa*` - `*secret*` - `*token*.txt` ## Notas Usa `git status --porcelain` para listar solo archivos del working tree (modificados, nuevos, staged). No escanea el contenido del archivo, solo el nombre. Las claves GPG cifradas (`.gpg`) no se detectan intencionalmente — son opacas. Exit 0 siempre que el directorio sea un repo git valido, incluso si no hay matches.