1

背景

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,代表漏洞的代码流追踪路径。这里的 PrimarySecondary 节点中的位置构成了代码流的路径。

通过这样的转换过程可以将 Fortify 的扫描结果整合到 GitHub Advanced Security 中,实际的转换逻辑可能需要根据具体的 FVDL 文件结构进行调整。


作者: 汤青松

日期: 2024年8月19日


汤青松
5.2k 声望8.3k 粉丝

《PHP Web安全开发实战》 作者


引用和评论

0 条评论