ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Slither JSON 输出格式完全指南:从 detectors 结果到 upgradeability 检查

Slither JSON 输出格式完全指南:从 detectors 结果到 upgradeability 检查 应用安全区块链【免费下载链接】slitherStatic Analyzer for Solidity and Vyper项目地址https://gitcode.com/gh_mirrors/sl/slither点击查看免费下载本文是 SlitherSolidity 与 Vyper 静态分析器官方 JSON 输出格式的完整技术参考。它定义了 Slither 及slither-check-upgradeability工具通过--json选项导出的结构化结果规范涵盖顶层包装结构、detector 结果、结果元素、source mapping 定位信息以及各检测器特有的additional_fields扩展字段。读完本文你将掌握如何解析、消费 Slither 的 JSON 输出将静态分析结果接入 CI 流水线、安全工具链或自定义审计平台。概述何时使用 JSON 输出Slither 的命令行工具如 slither/slither.py 对应的主程序支持通过--json参数将分析结果导出为机器可读的 JSON。该选项在 slither/utils/command_line.py 中被定义为json配置项默认值为None并可用--json -将结果输出到 stdout。与人类可读的表格输出相比JSON 输出具有以下典型用途将检测结果集成到自定义的代码审计或漏洞管理平台在 CI 中按impact/confidence字段自动分级、筛选并告警通过source_mapping在编辑器或代码视图中精确定位问题代码为slither-check-upgradeability的可升级性检查结果提供结构化消费入口。底层序列化逻辑集中在 slither/utils/output.py 的output_to_json函数中见 output.py#L60-L85它构造{success: ..., error: ..., results: ...}三层结构然后根据文件名参数决定写入文件indent2缩进还是打印到 stdout。值得注意的实现细节是当目标文件已存在时Slither 会拒绝覆盖并输出一条日志提示这是为了保证导出结果不被意外破坏。Top-level Command Output顶层命令输出Slither 任意检测器detectors、打印机printers或工具导出的 JSON其顶层结构始终一致{ success: true, error: null, results: {} }字段说明successbooleantrue表示results成功输出false表示发生了error。errorstring | null当success为false时这里会携带相关的错误信息字符串否则为null。resultscommand-results见下文当success为true时这里是一个按 JSON 参数不同而填充不同结果类型的对象。在源码层面该包装结构由output_to_json中的一行代码直接生成slither/utils/output.py#L70json_result {success: error is None, error: error, results: results}也就是说success的真实语义是error是否为None。当分析中途抛出异常如合约未找到、编译失败时调用方会以非None的错误字符串调用output_to_json此时success即为false。Command Results命令结果对象results对象内部按结果类型分门别类存放基本形态如下{ detectors: [], upgradeability-check: {} }detectors可选vulnerability-results见下文任何 detector 分析的结果数组。upgradeability-check可选upgradeability-results见下文slither-check-upgradeability工具输出的结果。这两个键都是可选的运行普通slither命令时通常只有detectors运行slither-check-upgradeability --json时则出现upgradeability-check。从 slither/utils/command_line.py#L20-L29 可以看到Slither 还支持通过--json-types参数进一步控制 JSON 中混入的其他结果类型可用值包括compilations、console、detectors、printers、list-detectors、list-printers和timing默认值为detectors,printers。Detector Results检测器结果detectors数组中的每一条结果都遵循如下格式{ check: ..., impact: ..., confidence: ..., description: ..., elements: [] }字段说明checkstring检测器标识符即 detector 的ARGUMENT例如constant-function-asm、naming-convention、reentrancy-eth等。impactstring影响等级取值为High/Medium/Low/Informational。confidencestring置信度取值为High/Medium/Low。descriptionstringSlither 对该发现的文本描述。elementselement 数组见下文与本发现相关的、映射到源码的元素数组。注意编写 detector 时第一个元素应当精心选择用于代表该发现中映射代码最关键的部分——即外部工具应优先聚焦的问题源码区域。additional_fields可选任意类型检测器特有的补充信息并非总是存在。在实现层面impact与confidence由 detector 的IMPACT/CONFIDENCE枚举值经classification_txt映射为字符串并由基类写入结果对象见 slither/detectors/abstract_detector.py#L285-L288output.data[check] self.ARGUMENT output.data[impact] classification_txt[self.IMPACT] output.data[confidence] classification_txt[self.CONFIDENCE] output.data[reference] self.WIKI此外每条结果还会附带markdown、id、first_markdown_element等派生字段id是对描述文本含源码定位做 SHA3-256 哈希得到的指纹见 slither/utils/output.py#L423-L424可用于跨版本稳定地识别同一类发现。Detector Result Elements结果元素elements数组中的每个元素形如{ type: ..., name: ..., source_mapping: {}, type_specific_fields: {}, additional_fields: {} }字段说明typestring元素类型取值为contract、function、variable、node、pragma、enum、struct、event从源码看还可能出现custom_error、file、other等内部类型。namestring元素名称。对于contract/function/variable/enum/struct/event类型指定义名。对于node类型指底层表达式的字符串表示若无底层表达式则为空字符串。对于pragma类型指 pragma 的version部分如^0.5.0。source_mappingsource mapping见下文定义该元素对应源码范围的对象。type_specific_fields可选任意类型对于function/event类型元素parentresult-element该定义所属的父合约。signaturestring该函数的完整签名。对于enum/struct类型元素parentresult-element该定义所属的父合约。对于variable类型元素parentresult-element若该变量是状态变量指向父合约若是局部变量指向父函数。对于node类型元素parentresult-element该节点所属的父函数。对于pragma类型元素directivestring 数组完整序列化的 pragma 指令如[solidity, ^, 0.4, .9]。additional_fields可选任意类型检测器特有的元素级补充信息并非总是存在。这些字段由 slither/utils/output.py 中的Output类按类型分别构建add_variable、add_contract、add_function、add_enum、add_struct、add_event、add_node、add_pragma等方法见 output.py#L476-L672统一通过_create_base_element组装出{type, name, source_mapping}骨架再按需附加type_specific_fields与additional_fields。例如add_function会写入signature: function.full_name与parent: _create_parent_element(function)add_node会以str(node.expression)作为name无表达式则为空串add_pragma会写入directive: pragma.directive。父元素通过_create_parent_element递归生成output.py#L366-L391从而在结果中形成可遍历的元素—父元素树。Source Mapping源码映射每个source_mapping对象用于将元素映射到源码的某个片段格式如下source_mapping: { start: 45 length: 58, filename_relative: contracts/tests/constant.sol, filename_absolute: /tmp/contracts/tests/constant.sol, filename_short: tests/constant.sol, filename_used: contracts/tests/constant.sol, lines: [ 5, 6, 7 ], starting_column: 1, ending_column: 24, }字段说明startinteger映射源码的起始字节位置。lengthinteger映射源码的字节长度。filename_relativestring相对于分析目录的文件路径。filename_absolutestring文件的绝对路径。filename_shortstring用于展示的短文件名隐藏平台特定目录如node_modules。filename_usedstring平台分析所使用的路径非标准。linesinteger 数组映射源码跨越的行号数组行号从 1 开始。starting_columninteger映射源码首行的起始列/字符位置从 1 开始。ending_columninteger映射源码末行的结束列/字符位置从 1 开始。该对象由Source.to_json()生成见 slither/core/source_mapping/source_mapping.py#L32-L47。所有可被映射的实体合约、函数、变量、CFG 节点等都继承自SourceMapping基类source_mapping.py#L207-L223在解析过程中调用set_offset将 Solidity AST 提供的形如45:58:2的文本偏移转换为上述结构化对象。start/length是字节偏移而非字符偏移因此源码中包含 Unicode 字符时不应直接用source_code[start:end]切片读取源码中content属性专门以 UTF-8 编码处理了这一点见 source_mapping.py#L70-L88。值得一提的是filename_used在代码中因会产生不确定结果有时指相对路径、有时指绝对路径而存在TODO注释source_mapping.py#L36-L39当前版本的to_json实际并未输出该键——这是消费端需要注意的一个兼容性细节。Detector-specific additional fields检测器特有附加字段部分检测器会通过其结果或结果元素的additional_fields字段输出自定义信息。文档中按结果级result或结果元素级result-element标注附加字段的位置constant-functioncontain_assembly结果级boolean标识该发现是否因函数包含汇编代码所致。实际实现中constant-function-asm与constant-function-state两个检测器分别以{contains_assembly: True}见 slither/detectors/attributes/const_functions_asm.py#L82和{contains_assembly: False}见 slither/detectors/attributes/const_functions_state.py#L87传入generate_result作为结果级的附加字段输出。naming-conventionconvention结果元素级string标识用于发现该问题的命名规范合法取值如下CapWordsmixedCasel_O_I_should_not_be_usedUPPER_CASE_WITH_UNDERSCOREStarget结果元素级string标识发现的类型constant、parameter 等合法取值如下contractstructureeventfunctionvariablevariable_constantparameterenummodifier例如在 slither/detectors/naming_convention/naming_convention.py#L81 中合约命名违反 CapWords 时会在元素上附加{target: contract, convention: CapWords}函数/参数则用mixedCase常量用UPPER_CASE_WITH_UNDERSCORES而状态变量名中出现容易混淆的l/O/I字符时用l_O_I_should_not_be_used。reentrancy所有变体即reentrancy-eth、reentrancy-no-gas、reentrancy-read-before-write、reentrancy-events、reentrancy-benign等underlying_type结果元素级string指明结果元素的底层类型取值为external_calls、external_calls_sending_eth或variables_written。重入检测器在产出结果时按元素分别标注类别例如 slither/detectors/reentrancy/reentrancy_no_gas.py#L169-L197 对外部调用附加{underlying_type: external_calls}、对发送 ETH 的调用附加{underlying_type: external_calls_sending_eth}、对写入变量附加{underlying_type: variables_written}部分实现如reentrancy-eth还会附上variable_name指明具体被写入的状态变量名。这使消费端能够区分重入调用与重入后状态变更这两类不同语义的元素而无需重新解析描述文本。Slither Check Upgradeability可升级性检查输出slither-check-upgradeability工具同样支持--json选项--json -可输出到 stdout见 slither/tools/upgradeability/main.py#L53-L58。其 JSON 顶层结构与 Slither 主体一致{ success: true, error: null, results: { upgradeability-check: {} } }字段说明successbooleantrue表示results成功输出false表示发生了error。errorstring | null当success为false时携带错误信息字符串否则为null。resultsupgradeability-check-results见下文当success为true时包含一个upgradeability-check对象其中填充了各类可升级性检查结果当success为false时upgradeability-check对象为空。Upgradeability Check Results可升级性检查结果upgradeability-check对象形如{ check-initialization: {}, check-initialization-v2: {}, compare-function-ids: {}, compare-variables-order-proxy: {}, compare-variables-order-implementation: {} }这些键与 slither/tools/upgradeability/checks 目录下的检查类一一对应分别验证合约初始化是否符合规范、V2 版本的初始化、新旧合约函数选择器function IDs的一致性、代理合约与实现合约的状态变量声明顺序是否匹配等。从 slither/tools/upgradeability/main.py#L280-L379 的实现可以看出该工具在运行结束时统一调用output_to_json(args.json, None, json_results)输出结果而在出错路径如指定合约未找到、抛出SlitherException中则以错误字符串调用同一函数success随之变为false。与主 Slither 输出的区别在于结果集中始终带有proxy-present、contract_v2-present两个布尔键与detectors数组其中每一项同样遵循上文 Detector Results 的格式各检查项的产出通过AbstractCheck基类的check()方法收集slither/tools/upgradeability/checks/abstract_checks.py#L130-L142即把_check()返回的Output对象统一转为r.data字典列表与 Slither 主体共享同一套 JSON 结构约定。实战建议与消费要点始终先校验success无论消费 Slither 还是 upgradeability 的 JSON都应先检查顶层success与error再决定是否解析results避免把错误报告当作正常分析结果处理。优先使用elements[0]定位问题代码规范约定每个发现的首个元素是问题最集中、外部工具应优先聚焦的源码区域配合source_mapping.lines与starting_column/ending_column可以精确高亮问题行。善用impact/confidence做分级策略在 CI 中可按High High阻断构建Informational仅记录减少噪声Slither 自身的--exclude-informational、--exclude-optimization、--exclude-low、--exclude-medium、--exclude-high等过滤参数可作为输出前的第一道筛选见 slither/utils/command_line.py#L41-L59 的默认配置项。注意字段的版本兼容性filename_used与additional_fields并非所有版本都稳定存在upgradeability-check的键集合也会随检查项增减而变化解析时应做缺省兜底同时source_mapping中的start/length是字节偏移涉及源码切片时应以 UTF-8 编码处理。配套格式除 JSON 外Slither 还支持 SARIF--sarif供 GitHub 安全告警等工具使用实现见 slither/utils/output.py#L159-L206 的output_to_sarif以及 zip 压缩导出output_to_zip压缩包内为slither_results.json可按下游工具链的接受格式灵活选用。参考文档与进一步阅读本规范对应的官方文档docs/src/api/JSON-output.mdJSON 序列化核心实现slither/utils/output.pyOutput类与output_to_json/output_to_sarif/output_to_zip命令行参数与--json-types定义slither/utils/command_line.pysource mapping 序列化slither/core/source_mapping/source_mapping.pydetector 结果组装slither/detectors/abstract_detector.py可升级性检查入口slither/tools/upgradeability/main.py 与 slither/tools/upgradeability/checks/abstract_checks.py检测器附加字段示例slither/detectors/naming_convention/naming_convention.py、slither/detectors/reentrancy/reentrancy_no_gas.py赞分享应用安全区块链【免费下载链接】slitherStatic Analyzer for Solidity and Vyper项目地址https://gitcode.com/gh_mirrors/sl/slither点击查看免费下载相关推荐Wand 修改器增强功能完整指南3 步免费激活 Pro 手机远程面板Wand 修改器增强功能完整指南3 步免费激活 Pro 手机远程面板 Wand Enhancer 是一个开源本地补丁工具帮你在自己电脑上为 Wand原桌面应用前端Rekall内存取证最佳实践避免常见错误与陷阱Rekall内存取证最佳实践避免常见错误与陷阱 Rekall Memory Forensic Framework是一款强大的开源内存取证工具能够帮助安全分析WebdriverIO JSON 报告器完全指南从配置输出到并行结果合并WebdriverIO JSON 报告器完全指南从配置输出到并行结果合并 导读 wdio/json reporter 是 WebdriverIO 官方提供的测试质量保障上一篇Skill Seekers 架构完全指南从 UML 包图到源码级的模块化设计解析下一篇Gitpod image-builder-mk3 源码级解析工作区镜像构建服务的架构、本地开发与云权限配置创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表