Faraday 4.3.0 更新深度解析:CVSS 数据模型、CSV 导出与批量删除的工程化演进
网络安全渗透测试漏洞扫描【免费下载链接】faradayOpen-source and AI-powered cybersecurity tools for offensive security, vulnerability management, and autonomous pentesting. Built by hackers in Latin America, used worldwide.项目地址https://gitcode.com/gh_mirrors/far/faraday点击查看免费下载Faraday 是一款开源的安全测试与漏洞管理平台支持以工作区Workspace为中心管理主机、服务、漏洞与凭据并提供 Agent 自动化扫描能力。本文以 Faraday 4.3.02022 年 12 月 1 日发布社区版更新日志为骨架逐一拆解其 8 项功能改进背后的源码实现——从 CVSS 评分字段补全、CSV 导出列扩展到带过滤器的批量删除与数值字段过滤逻辑重构帮助读者理解这些改动在数据模型、API 层与报告处理流程中的落点掌握在 Faraday 中排查漏洞数据、导出报告与批量运维的具体方法。版本背景与更新总览Faraday 4.3.0 是一次聚焦漏洞数据模型完备性与批量操作能力的迭代。从 CHANGELOG/4.3.0/community.md 可以看到本版本包含 4 项功能新增[ADD]、2 项修复[FIX]以及 2 项内部逻辑改进核心脉络可归纳为三条主线漏洞评分与导出链路补全为漏洞模型补齐 CVSS3 Scope 字段并让 CSV 导出携带 CVSS2/CVSS3 向量与 CWE 信息批量操作能力增强批量创建Bulk Create时改进 Command 对象生成同时为各工作区资源提供基于过滤器的批量删除Bulk Delete状态一致性与过滤正确性修复 Agent 执行返回空结果时的命令状态、工作区统计端点ws filter endpoint的 open/closed 统计并重构数值字段的过滤逻辑。下文按更新日志条目顺序展开每个小节均结合faraday/server下的实际实现说明其原理与用法。一、Agent 执行返回空结果时正确更新关联 Command[FIX]变更内容当一次 Agent 执行Agent Execution返回空结果时与之关联的 Command 记录现在会被正确更新避免命令状态停留在错误的中间态。源码佐证Agent 每次执行都会由 faraday/server/utils/agents.py 中的get_command_and_agent_execution()同时创建一条Command和一条AgentExecution两者通过外键关联command Command( import_sourceagent, toolexecutor.agent.name, commandexecutor.name, paramsparams, start_datedatetime.utcnow(), workspaceworkspace, creator_iduser_id, ) agent_execution AgentExecution( runningNone, successfulNone, commandcommand, ... )而在报告处理链路中faraday/server/utils/reports_processor.py 定义了command_status_error()def command_status_error(command_id: int): command Command.query.filter_by(idcommand_id).first() command.command error db.session.commit()工程含义该修复确保Agent 执行但未产出任何主机/漏洞数据的场景下命令记录仍会被标记为完成或失败而不是保持running状态。从代码结构看它主要影响 Agent 自动化扫描场景的状态机完整性——用户可在 Web UI 的 Agent 执行列表对应 faraday/server/api/modules/agent_execution.py 的AgentExecutionView中准确看到每次任务的最终状态。二、漏洞 Schema 新增 CVSS3 Scope 字段[ADD]变更内容在漏洞Vulnerability的序列化 Schema 中新增cvss3_scope字段。数据模型侧Vulnerability模型在 faraday/server/models.py 中维护了完整的 CVSS3 指标列cvss3_modified_confidentiality_impact Column(Text, nullableTrue) cvss3_modified_integrity_impact Column(Text, nullableTrue) cvss3_modified_availability_impact Column(Text, nullableTrue) cvss3_scope Column(Text, nullableTrue)模型的_fill_cvss3_data()方法models.py 第 1827-1830 行附近在解析cvss3_vector_string时会将 CVSS 库中的SScope影响范围指标写入cvss3_scope同时写入cvss3_modified_scopeMS等修正指标。批量创建侧由于 Agent 与报告解析最终都通过 Bulk Create 写入漏洞数据faraday/server/api/modules/bulk_create.py 的set_cvss3_data()在反序列化时同样调用get_propper_value(cvss_instance, S)填充cvss3_scope并在init_cvss3_data()中将其默认置为None。工程含义Scope 是 CVSS3 评分体系Base/Temporal/Environmental中衡量漏洞影响是否超出受影响组件的关键指标取值为Unchanged/Changed。此字段加入后漏洞 API 返回的数据与 CSV 导出中均可完整呈现 CVSS3 的 Scope 维度为基于 CVSS 向量做评分审计与报告生成提供了数据基础。三、CSV 导出新增 CVSS2/CVSS3 与 CWE 列[ADD]变更内容漏洞 CSV 导出export_csv中新增cvss2/3与cwe列。源码佐证faraday/server/utils/export.py 中export_vulns_to_csv()定义的列头明确包含vuln_headers [ confirmed, id, date, name, severity, service, target, desc, status, hostnames, comments, owner, os, resolution, refs, easeofresolution, web_vulnerability, data, website, path, status_code, request, response, method, params, pname, query, cve, cvss2_vector_string, cvss2_base_score, cvss3_vector_string, cvss3_base_score, cvss4_vector_string, cvss4_base_score, cwe, policyviolations, external_id, ... ]在_build_vuln_data()第 264-269 行中这些列从序列化后的漏洞对象中取值例如vuln.get(cvss2).get(vector_string)、vuln.get(cwe)。此外导出函数通过csv_escape()第 289-296 行对以、、-、开头的单元格值添加前导单引号防 CSV 公式注入——这是导出工具的一个安全细节值得使用者知晓。使用方式漏洞列表接口faraday/server/api/modules/vulns_base.py支持export_csvtrue与export_csv_limitedtrue两个查询参数二者互斥前者导出全量字段仅排除_attachments、desc后者默认仅导出精简字段集id、name、severity、status、confirmed、cvss2/cvss3/cvss4等可通过q{columns: [...]}显式指定列以降低大工作区导出时的内存压力。典型调用curl -u user:pass https://faraday.example.com/_api/v3/ws/{workspace}/hosts/vulns/?export_csvtrueq{\filters\:[{\name\:\severity\,\op\:\eq\,\val\:\high\}]}四、Bulk Create 中的 Command 对象生成改进变更内容批量创建对象时CommandObject命令与所创建对象的关联记录的生成方式得到优化。源码佐证在 faraday/server/api/modules/bulk_create.py 中_create_command_object_for()为每个新建/更新的主机、服务、漏洞生成命令关联def _create_command_object_for(ws, created, obj, command: dict): data { object_id: obj.id, object_type: get_object_type_for(obj), command_id: command[id], created_persistent: created, workspace: ws, } get_or_create(ws, CommandObject, data)而insert_vulnerabilities()第 432-479 行使用 PostgreSQL 的INSERT ... ON CONFLICT DO UPDATE做幂等写入manage_relationships()第 512-620 行则在批量插入后统一处理CommandObject、VulnerabilityReference、CVE/CWE/OWASP/Policy Violation 关联及凭据多对多关系最后通过SeveritiesHistogram更新严重程度直方图。工程含义改进后的逻辑让一次报告解析产生的大量对象与发起这次解析的命令之间的追溯关系更可靠。前端在 Web UI 中点击某条命令即可看到该命令创建的全部对象——这正是 Faraday 以Command为中心还原扫描会话的依据。五、修复工作区统计端点ws filter endpoint的 open/closed 统计变更内容修复通过过滤器访问工作区统计信息时open/closed漏洞数量统计不准确的问题。源码佐证工作区摘要统计由 faraday/server/api/modules/workspaces.py 中的WorkspaceSummarySchema暴露它把模型上的计数属性映射为 API 字段opened_vulns fields.Integer(dump_onlyTrue, attributevulnerability_open_count) re_opened_vulns fields.Integer(dump_onlyTrue, attributevulnerability_re_opened_count) risk_accepted_vulns fields.Integer(dump_onlyTrue, attributevulnerability_risk_accepted_count) closed_vulns fields.Integer(dump_onlyTrue, attributevulnerability_closed_count)工程含义漏洞状态open、re-opened、closed、risk-accepted等是工作区仪表盘的核心维度。该修复保证在启用过滤器filter查询工作区汇总数据时状态统计与实际数据保持一致避免仪表盘出现已关闭漏洞数量与实际不符的偏差。六、报告上传校验失败时标记 Command 为 error 状态变更内容在报告Report上传处理流程的每一处校验失败点都将对应 Command 的状态置为error。源码佐证faraday/server/utils/reports_processor.py 的处理循环中对以下几种失败场景均会调用command_status_error(command_id)插件解析报告抛出异常Processing Error找不到能处理该报告类型的插件No plugin detected for reportJSON 报告文件加载失败Loading data from json file将解析结果写入数据库失败Save Error。结合上文第二节的command_status_error()实现将command.command置为error并提交该改动确保任何一步失败都不会让命令停留在未完成状态。工程含义这提升了失败的可观测性。运维人员排查某次上传的报告没有产生任何漏洞时可通过命令列表直接看到状态为error的记录从而区分解析失败与扫描结果为空两类情况后者由第一项修复处理。七、支持带过滤器的批量删除BulkDelete with filters[ADD]变更内容新增基于过滤器的批量删除能力——不再要求客户端显式传入对象 ID 列表而是可以直接用过滤条件filters圈定要删除的对象集合。源码佐证faraday/server/api/base.py 的BulkDeleteMixin提供DELETE路由route(, methods[DELETE]) def bulk_delete(self, *args, **kwargs): if request.args.get(ids, None) is not None: ids request.args.get(ids).split(,) elif request.args.get(q, None) is not None: filtered_objects self._process_filter_data(request.args.get(q, {filters: []})) ids filtered_objects else: abort(HTTP_BAD_REQUEST) ... response self._perform_bulk_delete(ids, **kwargs), HTTP_OK即两种删除模式并存传统按ids逗号分隔删除以及按qJSON 过滤表达式格式与列表查询一致删除。_perform_bulk_delete()通过 SQLAlchemy 的Query.delete(synchronize_sessionfetch)一次性下发删除语句。工作区内的视图则使用BulkDeleteWorkspacedMixinbase.py 第 1816-1833 行自动将查询限定在workspace_id 当前工作区内。使用方式删除某工作区中所有状态为closed的漏洞curl -X DELETE -u user:pass \ https://faraday.example.com/_api/v3/ws/{workspace}/hosts/vulns/?q{\filters\:[{\name\:\status\,\op\:\eq\,\val\:\closed\}]}注意事项批量删除会触发数据库外键的ON DELETE CASCADE相关迁移见 faraday/migrations/versions/1b2533cc16fe_fix_custom_fields_display_name_was_used_.py 等级联迁移删除漏洞会连带清理其参考、关联与评论等子记录。建议先以列表接口 相同q参数预览命中集合再执行删除。八、数值字段过滤逻辑重构Change filter logic on numeric fields变更内容重构了数值字段的过滤处理逻辑使 API 层传入的字符串数值能被正确转换为数字类型后再与数据库列比较。源码佐证faraday/server/utils/filters.py 的_validate_filter_types()在解析过滤值时做了类型收敛if isinstance(filter_[val], str) and filter_[name] ! target: if filter_[val].isnumeric(): filter_[val] int(filter_[val]) else: try: float_value float(filter_[val]) filter_[val] float_value except ValueError: pass随后第 278-286 行对、、、等比较操作符做了类型约束只有数值或日期字段允许使用比较操作符否则抛出ValidationErrorlike/ilike则禁止作用于数值列range操作符仅允许用于日期或数值。最终会通过 marshmallow-sqlalchemy 的ModelConverter将列转换为对应字段并执行field.deserialize()做最终类型校验。工程含义Faraday 的过滤器语法{filters: [{name: ..., op: ..., val: ...}]}是 Web UI 高级搜索与 API 查询的通用语言。该重构一方面让诸如port整数、cvss2_base_score浮点这类数值列能接收前端以字符串形式提交的值如80、9.8另一方面通过严格的类型校验避免把非法操作符直接透传给 PostgreSQL 而产生 500 错误——换言之查询语义更严谨、报错更明确。小结4.3.0 的工程主线从源码视角回看Faraday 4.3.0 的改动并非孤立的功能拼盘而是围绕漏洞数据全生命周期的连贯打磨变更点涉及文件影响面Agent 空结果修复faraday/server/utils/agents.py、faraday/server/utils/reports_processor.pyAgent 任务状态机CVSS3 Scope 字段faraday/server/models.py、faraday/server/api/modules/bulk_create.py漏洞数据模型与 APICSV 导出扩展faraday/server/utils/export.py、faraday/server/api/modules/vulns_base.py报告导出Command 对象生成改进faraday/server/api/modules/bulk_create.py批量导入性能与追溯性工作区统计修复faraday/server/api/modules/workspaces.py仪表盘统计报告失败状态标记faraday/server/utils/reports_processor.py报告处理可观测性批量删除带过滤faraday/server/api/base.py漏洞生命周期运维数值过滤重构faraday/server/utils/filters.py全站搜索/过滤语义对于正在使用 Faraday 的团队本版本的实践要点可归纳为用export_csv拿到带 CVSS2/3 向量与 CWE 的完整漏洞清单用于外部审计用带q过滤器的BulkDelete批量收敛已关闭漏洞用命令的error状态快速定位报告解析失败的任务。若需查阅本版本完整变更条目可参考 CHANGELOG/4.3.0/community.md发布于 2022 年 12 月 1 日见 CHANGELOG/4.3.0/date.md。赞分享网络安全渗透测试漏洞扫描【免费下载链接】faradayOpen-source and AI-powered cybersecurity tools for offensive security, vulnerability management, and autonomous pentesting. Built by hackers in Latin America, used worldwide.项目地址https://gitcode.com/gh_mirrors/far/faraday点击查看免费下载相关推荐Zotero批量元数据编辑用CSV导入导出实现批量更新Zotero批量元数据编辑用CSV导入导出实现批量更新 你是否还在为Zotero中数百条文献的元数据逐一修改而烦恼手动编辑不仅耗时耗力还容易出现遗漏和错误桌面应用科研Kaminari批量操作支持分页数据的批量更新与删除实现Kaminari批量操作支持分页数据的批量更新与删除实现 你是否遇到过这样的情况在Ruby on Rails应用中使用Kaminari实现数据分页后需要对后端ExifToolGui 元数据管理功能深度解析从批量删除到智能导入ExifToolGui 元数据管理功能深度解析从批量删除到智能导入 前言 在数字图像处理领域元数据管理一直是专业摄影师和图像工作者的核心需求之一。ExifT桌面应用图像处理上一篇突破Windows限制让iPhone HEIC照片实现秒级预览的革新方案下一篇突破Amlogic S905X网络限制用内核定制方案实现72小时稳定连接创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考