2个版本

0.1.1 2023年6月28日
0.1.0 2023年6月28日

#410编程语言

自定义许可

205KB
4.5K SLoC

Vuln Reach Logo

GitHub Repo stars GitHub Discord


概述

漏洞可达性 是一个用于开发工具的库,用于确定给定的漏洞是否可达。由 Phylum 提供给开源社区,以帮助减少假阳性并增加软件开发者的信号与噪声比。

它是如何工作的?

漏洞可达性 是一个用 Rust 编写的静态分析库,它利用 tree-sitter 进行解析。目前它支持 JavaScript。

它构建了一个包及其传递依赖项的源代码的访问图,然后使用它来搜索到已知漏洞标识符节点的路径。

使用方法

将以下内容添加到您的 Cargo.toml

[dependencies]
vuln-reach = { git = "https://github.com/phylum-dev/vuln-reach" }

示例

以下是一个示例,说明您如何确定包中的一个标识符节点是否可以从另一个包中访问。

use vuln_reach::javascript::package::reachability::VulnerableNode;
use vuln_reach::javascript::package::resolver::PackageResolver;
use vuln_reach::javascript::package::Package;
use vuln_reach::javascript::project::Project;

// Build a package resolver.
let package_resolver = PackageResolver::builder()
  .with_package("path-scurry", Package::from_tarball_path("./tarballs/path-scurry-1.6.1.tgz"))
  .with_package("lru-cache", Package::from_tarball_path("./tarballs/lru-cache-7.14.1.tgz"))
  .with_package("minipass", Package::from_tarball_path("./tarballs/minipass-4.0.2.tgz"))
  .build();
  
// Build a project from the package resolver.
let project = Project::new(package_resolver);

// Define a target node.
let vulnerable_node = VulnerableNode::new("lru-cache", "index.js", 1017, 17, 1017, 24);

// Compute the reachability graph.
let reachability = project.reachability(&vulnerable_node);

// Find a path to the vulnerable node, starting from the given package.
let path = reachability.find_path("path-scurry");

要找出您项目的传递依赖项,您可以使用 Phylum

有关使用方法的更完整示例,请参阅 cli

贡献

您如何添加对其他语言的支持?

目前,代码库与 JavaScript 的耦合相对紧密。正在进行计划,将非语言特定部分抽象出来,以便用于所有语言。

添加对新的语言支持需要以下步骤

  • 将相关的 tree-sitter 解析器添加到 build.rs
  • vuln-reach 包的顶层创建您的语言的模块目录。
  • 实现语言的导入和导出抽象。
  • 为您的语言实现 访问概念 -- 这可能只是“函数调用”的等价,也可能是必要的复杂程度。

商业许可

如果您希望在商业项目中使用 vuln reach 并需要不同的许可协议,请与 [email protected] 联系。

依赖项

~6–17MB
~235K SLoC