falco 通过监控 python 进程的系统调用(如 execve、openat、connect)捕获其行为,而非解析字节码或挂钩解释器;需正确配置事件源、合理使用 proc.aname[2] 等字段编写规则,并验证 yaml 语法。

Python 进程怎么被 Falco 捕获到
Falco 本身不解析 Python 字节码,也不挂钩 import 或 exec,它靠的是内核事件——只要 Python 进程调用系统调用(比如 openat、connect、execve),Falco 就能看见。所以不是“监控 Python”,而是监控“跑 Python 的那个进程”干了什么。
常见错误是以为要装 Python agent 或 patch 解释器——完全不需要。只要 python3 /tmp/malware.py 启动了,Falco 就能基于它的 PID、命令行参数、文件访问路径做规则匹配。
- 确保 Falco 启用了
syscall_event_sources(默认开启) - Python 脚本启动方式影响
proc.cmdline字段:用python3 -c "import os; os.system(...)"会把整条命令塞进字段,而用python3 script.py则只记录脚本路径 - 容器里跑的 Python?得确认 Falco 是以
hostPID: true或 eBPF 驱动模式运行,否则看不到容器内进程的系统调用
写规则时怎么识别恶意 Python 行为
别写“检测 Python”,要写“检测异常行为+关联 Python 上下文”。Falco 规则本质是条件组合:事件类型 + 进程名 + 命令行特征 + 文件路径 + 父进程链。
比如想拦反连 shell:connect 事件 + proc.name = python3 + fd.ip != "127.0.0.1" + proc.cmdline contains "socket" or "requests.post" ——但注意,proc.cmdline 可能被截断或为空,不能单独依赖。
立即学习“Python免费学习笔记(深入)”;
- 优先用
proc.pname(父进程名)判断是否由bash或sh启动,避免误杀gunicorn这类生产服务 -
proc.aname[2]可取到实际执行的 Python 脚本路径,比proc.cmdline更可靠(需 Falco ≥ 0.35) - 避免用正则匹配整个
proc.cmdline,容易因空格、引号、编码崩掉;改用contains或startswith做前缀判断
Falco 报告的 Python 进程 PID 总是变,怎么关联上下文
PID 变是正常的——Python 脚本退出、新进程启动,PID 自然重用。Falco 不维护进程生命周期,它只记录离散事件。想串起来,得靠其他字段拼接上下文。
比如一个下载并执行的 payload:curl | python3 -c,你会看到两个事件:一个是 execve 启动 python3,一个是它后续的 openat 读临时文件。它们共享 proc.pid 和 proc.ptid(父线程 ID),但更稳的是 proc.sid(会话 ID)或 user.loginuid(如果启用了 auditd)。
- 在容器环境,
k8s.pod.name和k8s.ns.name比 PID 更稳定,优先加进规则条件 - 如果用 eBPF 模式,可启用
track_process_events: true,让 Falco 主动跟踪进程创建/退出,补全proc.exe和proc.args - 不要指望单条规则覆盖完整攻击链;用多个规则 + 外部 SIEM 做时间窗口关联(Falco 本身不支持多事件状态机)
Python 日志里出现 Failed to load rules: error parsing rule
这通常不是 Python 相关,而是 YAML 格式或字段名写错了。Falco 规则文件是 YAML,但对缩进、冒号后空格、引号非常敏感;而且 Python 相关字段(如 proc.name)必须拼写准确,大小写都不能错。
最常踩的坑:把 proc.name 写成 process.name,或把 contains 当函数用写成 contains("python")(正确写法是 proc.name contains "python")。
- 用
sudo falco -r /etc/falco/falco_rules.yaml -V验证规则语法,-V 会输出详细解析错误位置 - 所有字符串值必须加引号,尤其是含
-或.的字段名(如"k8s.ns.name") - 规则中用到的宏(如
known_python_interpreters)必须已定义,否则报unknown macro——查/etc/falco/falco_rules.yaml或官方仓库里的rules/falco_rules.yaml
proc.name、proc.aname、proc.cmdline 这几个字段反复调,比研究 Python AST 实用得多。真正难的不是写规则,是区分哪些是 CI/CD 流水线里的合法 Python 调用,哪些是攻击者扔进来的临时脚本——这个得靠你自己的环境知识,Falco 不会替你判断。










