SuperAPI AI 工具集

fuzzing-python-expert

编程与开发

查看项目

更新于 10-15 21:53

技能介绍

用途:帮助为集成到 OSS-Fuzz 的开源 Python 项目编写、构建和验证模糊测试目标(fuzz target)。Python 模糊测试基于 Atheris,它封装 libFuzzer 并对 Python 字节码做覆盖率引导插桩。

主要能力与要点: 基础镜像须使用 FROM gcr.io/oss-fuzz-base/base-builder-python,并在 project.yaml 中设置 language: python。 Harness 为 .py 文件(约定命名 fuzz_<target>.py),包含 TestOneInput(data) 与 main(),main 中调用 atheris.instrument_all()、atheris.Setup(sys.argv, TestOneInput, enable_python_coverage=True) 和 atheris.Fuzz()。 插桩方式:instrument_all() 简单但可能过宽;可用 with atheris.instrument_imports(): 选择性导入被测模块。 FuzzedDataProvider 将原始字节拆成类型化值,方法包括 ConsumeBytes、ConsumeByteList、ConsumeString、ConsumeUnicode、ConsumeUnicodeNoSurrogates、ConsumeInt、ConsumeIntInRange、ConsumeFloat、ConsumeBool、ConsumeIntList、PickValueInList、ConsumeRemainingBytes。 构建:build.sh 中 pip3 install . 安装被测包,并用 compile_python_fuzzer 将每个 fuzz_*.py 编译为 $OUT 下的可执行文件。 种子语料放 $OUT/<fuzzer_name>_seed_corpus/ 或打包为同名 .zip;字典放 $OUT/<fuzzer_name>.dict,对 JSON、XML、YAML、CSV 等文本格式解析器尤其有用。结构化格式建议用脚本生成种子。

良好 harness 特征:插桩正确模块;面向解析器、模板引擎、序列化(pickle、JSON、YAML、XML)、网络协议处理等接受不可信字符串或字节的 API;捕获目标在坏输入下会抛出的预期异常;用 FuzzedDataProvider 提供结构化输入;被测模块导入放在模块级而非 TestOneInput 内;避免文件 I/O、网络、子进程;避免随机、datetime.now()、os.urandom() 等非确定性;启用 enable_python_coverage=True。

可发现的问题:未处理异常(ValueError、RecursionError、MemoryError、UnicodeDecodeError 等)、AssertionError、挂起或死循环、C 扩展中的崩溃、逻辑错误。

操作与验证:使用 python3 infra/helper.py build_fuzzers <project>、check_build <project>、run_fuzzer <project> <fuzzer_name> -- -max_total_time=30 验证。可先用 python3 fuzz_target.py <seed_file> 本地单输入调试;本地 pip3 install . 快速迭代;本地迭代时可将 Dockerfile 的 RUN git clone 改为 COPY 避免网络往返。应记录每个入口点的选择理由及可能发现的缺陷类别。

限制:资料未提供收费、价格、平台支持范围等额外信息。