背景
Fortify 是业界广泛使用的 SAST 工具之一,它生成的 FVDL (Fortify Vulnerability Description Language) 文件是一种 XML 格式的报告,包含了程序安全漏洞信息。为了更好地利用这些信息并与现有的 CI/CD 流水线集成,有时我们需要将这些数据转换为CodeQL 的格式。
假设使用 Fortify 进行扫描的应用程序,希望将扫描结果整合到 GitHub 的 Advanced Security 中,利用 CodeQL 的强大功能进行进一步分析。需要将 FVDL 文件转换为 CodeQL 所的 JSON 格式。
操作方法
1. FVDL 文件片段(XML 示例,包括代码流)
首先看一下一个典型的 FVDL 文件片段,一个 SQL 注入漏洞及其代码流:
<Vulnerability>
<ClassInfo>
<Type>SQL Injection</Type>
<Kingdom>Input Validation and Representation</Kingdom>
</ClassInfo>
<AnalysisInfo>
<Unified>
<Trace>
<Primary>
<FileName>/var/www/html/login.php</FileName>
<LineNum>27</LineNum>
</Primary>
<Secondary>
<Location>
<FileName>/var/www/html/db.php</FileName>
<LineNum>15</LineNum>
</Location>
<Location>
<FileName>/var/www/html/utils.php</FileName>
<LineNum>42</LineNum>
</Location>
</Secondary>
</Trace>
</Unified>
</AnalysisInfo>
</Vulnerability>
2. 输出的 JSON 格式(包含 codeFlows
的 SQL 注入漏洞示例)
接下来是 JSON 输出格式,其中包含 codeFlows
信息来描述漏洞的追踪路径:
[
{
"ruleId": "SQL Injection",
"message": "Input Validation and Representation",
"severity": "High",
"locations": [
{
"filePath": "/var/www/html/login.php",
"line": 27
}
],
"codeFlows": [
{
"threadFlows": [
{
"locations": [
{
"filePath": "/var/www/html/login.php",
"line": 27
},
{
"filePath": "/var/www/html/db.php",
"line": 15
},
{
"filePath": "/var/www/html/utils.php",
"line": 42
}
]
}
]
}
]
}
]
3. PHP 代码实现(包含 codeFlows
)
下面是 PHP 脚本示例,读取 FVDL 文件并转换为 JSON 格式:
<?php
// 加载并解析 FVDL 文件
$fvdlFile = 'path/to/your/file.fvdl';
$xml = simplexml_load_file($fvdlFile);
if (!$xml) {
die('Error loading FVDL file');
}
// 初始化结果数组
$results = [];
// 遍历每个漏洞
foreach ($xml->Vulnerability as $vulnerability) {
$issue = [];
// 提取漏洞信息
$issue['ruleId'] = (string) $vulnerability->ClassInfo->Type;
$issue['message'] = (string) $vulnerability->ClassInfo->Kingdom;
$issue['severity'] = "High"; // 可根据需要进行调整
// 提取主要位置 (Primary)
$primaryLocation = [
'filePath' => (string) $vulnerability->AnalysisInfo->Unified->Trace->Primary->FileName,
'line' => (int) $vulnerability->AnalysisInfo->Unified->Trace->Primary->LineNum
];
$issue['locations'] = [$primaryLocation];
// 提取代码流 (Secondary locations for codeFlows)
$threadFlow = [$primaryLocation];
foreach ($vulnerability->AnalysisInfo->Unified->Trace->Secondary->Location as $location) {
$threadFlow[] = [
'filePath' => (string) $location->FileName,
'line' => (int) $location->LineNum
];
}
$issue['codeFlows'] = [
[
'threadFlows' => [
[
'locations' => $threadFlow
]
]
]
];
$results[] = $issue;
}
// 将结果转换为 JSON
$jsonOutput = json_encode($results, JSON_PRETTY_PRINT);
// 将 JSON 写入文件
file_put_contents('output.json', $jsonOutput);
echo "FVDL data with codeFlows has been converted to JSON and saved to output.json";
?>
4. 说明
- ruleId:
SQL Injection
表示漏洞类型。 - message: 漏洞的详细描述,来自
Kingdom
。 - severity: 漏洞的严重性,可以根据需求从 FVDL 文件中获取或手动设置。
- locations: 漏洞的主要位置,来自
Primary
节点。 - codeFlows: 包含
threadFlows
,每个threadFlow
包括多个locations
,代表漏洞的代码流追踪路径。这里的Primary
和Secondary
节点中的位置构成了代码流的路径。
通过这样的转换过程可以将 Fortify 的扫描结果整合到 GitHub Advanced Security 中,实际的转换逻辑可能需要根据具体的 FVDL 文件结构进行调整。
作者: 汤青松
日期: 2024年8月19日
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。