Golang中如何为CGO项目实现更好的SCA

Golang中如何为CGO项目实现更好的SCA 许多软件项目直接将第三方C/C++依赖的源代码文件检入版本控制系统。这与软件成分分析(SCA)的集成效果并不理想。因此,开发者最终会面临潜在的安全漏洞。

govulncheck 或许会碰巧为少数(c)Go项目注册CVE,但在包管理配置中,逻辑上管理依赖项却不包含版本标识符的传统做法,使得 govulncheck 难以可靠地从 go.mod 中获取此信息。具体的报告缺口在于缺乏自动化手段来检测哪些Go项目依赖于哪些原生依赖。

conan audit 和 Snyk for conan 可以提供帮助。但它们也代表了开发环境攻击面的扩大。开发者很可能需要拼凑一个脆弱、不可移植的shell脚本,来将conan制品塞进能被(c)go找到的目录。

长远来看,如果 go mod 能够发展到像 Conan 一样有能力管理和扫描C/C++包,那将是一件好事。

如果我们开始将第一方与第三方的C/C++ cgo代码隔离到不同的目录中会怎样?如果缺少对应的新 go.mod cgo 条目,后者将生成警告。

作为预防措施,cgo 也可以为未明确存放在这两个新目录中的原生代码生成警告。这样,我们可以在不牺牲安全性的前提下,兼容现有的 cgo 项目。

第三方原生代码应放置在标准的 vendor/ 目录树中,靠近存放第三方Go代码的位置。

govulncheck 和各种Go组件,应与 conan 及其CVE数据库集成,以最大限度地提高安全报告的准确性。

这同样适用于依赖C/C++代码的ECMAScript、JVM、Python、Ruby等项目:它们的包管理器应该在保护原生依赖方面做得更好。

此外,应该有人编写一个可移植的、纯Go的MIDI驱动库,这样MIDI项目就不需要依赖任何原生代码了。


更多关于Golang中如何为CGO项目实现更好的SCA的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

lemarkar:

这篇帖子太荒谬了。

找到了机器人账号。

是的,让我们继续保持 cgo 项目的最大不安全性。

更多关于Golang中如何为CGO项目实现更好的SCA的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


正如所料,没有实质性的论据。只有缺乏专业知识的煽动性言论。

既然C语言后端目前是主要的后端,所有语言都有包装器或与之交互的方式。但这并不意味着,你需要将C语言的缺陷责任转嫁给调用它的语言。如果你想使用cgo,那么恰恰是你,需要确保你使用的C代码中没有漏洞,而不是Go工具链的问题。

C/C++ 包管理器能扫描我的 Go 代码以查找漏洞吗?

这篇帖子太荒谬了。 首先,你无法将没有版本信息的包添加到 go.mod 文件中。那是一个错误,并且会在执行 go mod tidy 命令时提示,所以你根本无法获取任何依赖。

它之所以叫 govulncheck,是因为我们是用 Go 语言编程,并且希望查看用这种语言编写的代码中的安全问题,而不是那些花哨的 C 代码依赖。如果有人将 C 代码导入到他们的 Go 代码中,他们有责任确切地知道自己在导入什么。这不是 Go 工具链的任务。

许多软件项目直接将第三方C/C++依赖的源代码文件纳入版本控制。这与软件组成分析(SCA)的集成效果不佳,导致开发者最终面临潜在的安全漏洞。

govulncheck 可能偶尔会为少数(c)Go项目注册CVE,但那种在包管理配置中没有版本标识符的情况下逻辑上供应依赖的经典习惯,使得 govulncheck 难以可靠地从 go.mod 中获取此信息。具体的报告缺口在于缺乏自动化来检测哪些Go项目依赖于哪些原生依赖。

conan audit 和用于 conan 的 Snyk 可以提供帮助。但它们代表了开发环境攻击面的蔓延。开发者很可能拼凑出一个脆弱、不可移植的shell脚本,将 conan 制品塞进 ©go 能找到的目录。

长远来看,最好能让 go mod 发展得与 Conan 一样有能力管理和扫描 C/C++ 包。

如果我们开始将第一方与第三方的 C/C++ cgo 代码隔离到不同的目录中会怎样?如果缺少相应的新 go.mod cgo 条目,后者将生成警告。

作为预防措施,cgo 也可以为未明确放置在这两个新目录中的原生代码生成警告。这样我们就可以在不牺牲安全性的前提下,兼容现有的 cgo 项目。

第三方原生代码应放置在标准的 vendor/ 目录树中,靠近存放第三方 Go 代码的位置。

govulncheck 和各种 go 组件应与 conan 及其 CVE 数据库集成,以最大限度地提高安全报告的准确性。

这同样适用于依赖 C/C++ 代码的 ECMAScript、JVM、Python、Ruby 等项目:它们的包管理器应该更好地保护原生依赖。

并且应该有人编写一个可移植的、纯 Go 的 MIDI 驱动库,这样 MIDI 项目就不必依赖任何原生代码。

你好, 提升 Go 及其他生态系统中 C/C++ 依赖的安全性至关重要。将第一方与第三方的 cgo 代码隔离到不同目录,并对缺失的 go.mod 条目发出警告,可以增强清晰度。将 govulncheck 与 Conan 的 CVE 数据库等工具集成,将确保更好的漏洞检测。加强跨语言包管理器对原生依赖的管理是向前迈出的关键一步。如果您想进一步探讨,请告诉我!Tolls by Mail New York

此致, Fonit Henry

在Go项目中整合CGO依赖的SCA确实是一个挑战,特别是当C/C++代码直接嵌入版本控制系统时。以下是一些实用的方法,可以帮助改善这种情况:

1. 隔离第三方C/C++代码

将第三方C/C++依赖放在独立的目录中,例如vendor/cthird_party/c,并在go.mod中通过注释或自定义字段标记这些依赖。虽然Go模块系统不直接支持C/C++包管理,但可以通过构建标签或文件组织来实现隔离。

// go.mod 示例,使用注释标记C依赖
module example.com/myapp

go 1.21

// C依赖: libfoo (版本: 1.2.3)
// C依赖: libbar (版本: 2.1.0)

2. 使用构建约束管理CGO代码

通过构建标签将CGO代码分离到特定文件,便于识别和扫描。例如,将C依赖封装在c_deps.go文件中,并添加构建标签:

//go:build cgo
// +build cgo

package myapp

/*
#cgo CFLAGS: -I./vendor/c/libfoo/include
#cgo LDFLAGS: -L./vendor/c/libfoo/lib -lfoo
#include <foo.h>
*/
import "C"

3. 集成外部SCA工具

结合Conan或Snyk等工具扫描C/C++依赖,并通过脚本自动化生成依赖报告。以下是一个示例脚本,用于提取项目中的CGO依赖信息:

// scan_cgo_deps.go
package main

import (
    "fmt"
    "go/ast"
    "go/parser"
    "go/token"
    "regexp"
)

func main() {
    fset := token.NewFileSet()
    node, err := parser.ParseFile(fset, "c_deps.go", nil, parser.ParseComments)
    if err != nil {
        panic(err)
    }

    // 正则匹配CGO标志
    re := regexp.MustCompile(`#cgo\s+(CFLAGS|LDFLAGS):\s*(.*)`)
    ast.Inspect(node, func(n ast.Node) bool {
        if cg, ok := n.(*ast.CommentGroup); ok {
            for _, c := range cg.List {
                if matches := re.FindStringSubmatch(c.Text); matches != nil {
                    fmt.Printf("CGO flag found: %s = %s\n", matches[1], matches[2])
                }
            }
        }
        return true
    })
}

4. 为C依赖维护版本清单

在项目根目录创建c-dependencies.json文件,手动记录C/C++依赖的版本和来源,便于SCA工具解析:

{
    "dependencies": [
        {
            "name": "libfoo",
            "version": "1.2.3",
            "source": "https://github.com/foo/libfoo",
            "license": "MIT"
        },
        {
            "name": "libbar",
            "version": "2.1.0",
            "source": "vendor/c/libbar",
            "license": "Apache-2.0"
        }
    ]
}

5. 扩展govulncheck的扫描范围

通过自定义工具或脚本,将C依赖信息传递给govulncheck。例如,编写一个包装脚本,先使用Conan Audit扫描C依赖,再结合govulncheck输出综合报告:

#!/bin/bash
# scan.sh - 结合C和Go依赖扫描

# 扫描C依赖
conan audit . > conan_report.txt

# 扫描Go依赖
govulncheck ./... > go_report.txt

# 合并报告
echo "Security Scan Report" > combined_report.txt
echo "====================" >> combined_report.txt
cat conan_report.txt go_report.txt >> combined_report.txt

6. 纯Go替代方案

对于特定领域(如MIDI),积极寻找或开发纯Go库来避免CGO依赖。例如,使用gitlab.com/gomidi/midi这样的纯Go MIDI库:

import "gitlab.com/gomidi/midi"

func main() {
    // 纯Go MIDI操作,无需CGO
    driver := midi.NewDriver()
    defer driver.Close()
}

这些方法可以在不破坏现有项目结构的前提下,提高CGO依赖的可追踪性和安全性。虽然Go模块系统尚未原生支持C/C++包管理,但通过组织代码、结合外部工具和自定义脚本,可以显著改善SCA的覆盖范围。

回到顶部