跳到主要内容
版本:v0.21

报告和发现 API

Scanner::run() 在扫描完成后返回 stdClass 报告。Scanner::getReport() 返回相同的当前报告结构。发生捕获的扫描失败时,run() 返回 false;请检查扫描器实例上的 getLastError()

顶级报告约定

属性类型含义
scannedint已扫描文件数。
detectedint检测到的恶意软件匹配数。
verifiedByChecksumint通过校验和验证接受的文件数。
removed, ignored, edited, quarantine, whitelistarray受匹配操作影响的路径或记录。
infectedFoundarray扫描期间发现的受感染文件路径。
fileHashesarray扫描期间收集的文件哈希元数据。
findingsarray来自文件、完整性、归档和补充分析的规范发现记录。
coveragearray完整性、计数和跳过原因。
diagnostics存在时为 array非致命的分析或定义更新错误。
signature_indexesarray内置和可选信誉索引元数据。
inventory存在时为 array检测到的平台组件清单。

新的报告字段可以在次要版本中添加。使用方应读取所需字段,容忍未知字段,并对可选属性使用 isset()

处理成功和失败

$report = $scanner->run();

if ($report === false) {
throw new RuntimeException($scanner->getLastError() ?: 'Scan failed.');
}

foreach ($report->findings as $finding) {
if ($finding['severity'] === 'danger') {
// Send the finding to your incident workflow.
}
}

不要将非零的 detected 计数视为执行失败。发现用于识别需要审查的代码或完整性状况。它们不确定意图,也不授权删除。

发现记录约定

每条规范发现都包含以下字段:

字段类型含义
idstring从种类、提供程序、规则 ID 和规范化主题派生的稳定 SHA-256 标识符。
kindstring发现类别,例如 malwareintegrity 或补充分析类型。
subjectstring文件路径或扫描主题。
rule_idstring检测规则或指示器的稳定标识符。
severitystring检测器提供的严重性,通常为 warndanger
messagestring人类可读的检测详情。
statusstring当前发现状态。新发现初始为 open
evidencearray可用时的上下文,例如 linematchcontent_hash
providerstring检测器来源,例如 builtin
first_seen_at, last_seen_atstring发现观察的 ISO 8601 时间戳。

在去重告警时,请保留 rule_idsubject 和观察到的内容哈希。文件变更时,行号或片段可能改变。

覆盖范围是结果的一部分

报告包括 discoveredeligiblescannedskippedverifiedcachederrors 的覆盖范围计数。coverage.reasonspathextensionoversizedexcludedunreadablearchive_limit 分隔跳过的文件。

在接受扫描完成前,请使用此检查:

$coverage = $report->coverage;

if (empty($coverage['complete']) || !empty($coverage['errors'])) {
throw new RuntimeException('Scan coverage is incomplete.');
}

偏移量和限制批次、不可读文件、文件大小限制和归档限制都可能使结果不完整。完整的零发现结果比部分的零发现结果更有参考价值。

诊断和外部数据

diagnostics 报告非致命错误。例如,更新失败时扫描器可以继续使用缓存的 Maltrail 定义。请将诊断与发现一起持久化,以便操作人员能够区分干净结果和分析能力降低的结果。

signature_indexes 公开内置恶意软件和旧版核心索引的记录数及源哈希。当活动的 Maltrail 存储存在时,它还包括域名索引元数据及其更新时间。请将这些值用于审计跟踪,而不是替代发现证据。

序列化报告

在存储内存报告时,请使用带错误处理的 json_encode()

$json = json_encode($report, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);

if ($json === false) {
throw new RuntimeException('Could not serialize scan report: ' . json_last_error_msg());
}

当扫描器还应为外部工具写入文件时,请使用 setReportFormat('json')setReportFormat('sarif')。为报告、检查点、备份和隔离文件选择扫描项目之外的目录。