Sobelow 是一款针对 Elixir 和 Phoenix 框架的安全静态分析工具。对于安全研究人员来说,它有助于快速查看关注点。对于项目维护者,它可以用于防止引入多种常见漏洞。
目前,Sobelow 能检测以下安全问题的部分类型:
潜在漏洞以不同颜色标记,代表对不安全性的置信度。高置信度为红色,中置信度为黄色,低置信度为绿色。
通常,如果看起来某个函数可能被不安全地使用,但无法可靠判断该函数是否接受用户输入,则将其标记为“低置信度”。即:如果发现项标记为绿色,它可能具有严重不安全风险,但需要更多手动验证。
注意: 本项目持续开发中,后续会标记更多漏洞类型。如果遇到错误或希望请求更多功能或安全检查,请提交 issue!
要使用 Sobelow,可以将其添加到应用的依赖中。
def deps do
[
{:sobelow, "~> 0.13", only: [:dev, :test], runtime: false}
]
end
也可以通过命令行全局安装 Sobelow:
$ mix escript.install hex sobelow
若要安装 master 分支而非最新发布版本,可使用以下命令:
$ mix escript.install github nccgroup/sobelow
安装后,扫描 Phoenix 项目的最简单方法是在项目根目录运行:
$ mix sobelow
注意: 任何路径参数应为绝对路径,或相对于应用根目录的路径。
--root 或 -r - 指定应用根目录。接受路径参数,例如 ../my_project。
--verbose 或 -v - 打印代码片段和额外发现细节。
--ignore 或 -i - 忽略指定发现类型。接受逗号分隔的模块名称列表,例如 XSS.Raw,Traversal。
--ignore-files - 忽略文件。接受逗号分隔的文件名列表,例如 config/prod.exs。
--details 或 -d - 获取发现类型详情。接受单个模块名称,例如 Config.CSRF。
--all-details - 获取所有发现类型的详情。
Sobelow 允许用户将常用选项保存在配置文件中。例如,如果你经常运行:
$ mix sobelow -i XSS.Raw,Traversal --verbose --exit Low
你可以使用 --save-config 标志创建 .sobelow-conf 配置文件:
$ mix sobelow -i XSS.Raw,Traversal --verbose --exit Low --save-config
此命令将在应用根目录创建 .sobelow-conf 文件。你可以直接编辑此文件进行修改。
你也可以在首次使用此包时,不带任何选项运行该命令:
$ mix sobelow --save-config
生成的配置文件将填充每个选项的默认值。(这有助于快速将此包集成到现有代码库中。)
现在,如果你想使用保存的配置运行 Sobelow,可以使用 --config 标志:
$ mix sobelow --config
Sobelow 倾向于过度报告而非不足报告。因此,在典型扫描中可能会发现大量误报。这些发现项可以通过在函数定义前添加 # sobelow_skip 注释及模块列表来单独忽略。
# sobelow_skip ["Traversal"]
def vuln_func(...) do
...
end
当将 Sobelow 集成到新项目中时,可能会有大量误报。要将所有打印的发现项标记为误报,请使用 --mark-skip-all 标志运行 sobelow。
标记好相关发现项后,使用 --skip 标志运行 Sobelow:
$ mix sobelow --skip
虽然 # sobelow_skip 注释只能标记函数级别的发现项(因此无法用于跳过配置问题),但 --mark-skip-all 标志可用于跳过任何发现类型。
发现类别被划分为多个模块。这些模块可用于忽略某类发现(通过 ignore 和 skip 选项)或获取漏洞详情(通过 details 选项)。
此列表及其他有用信息可在命令行中查看:
$ mix help sobelow
要在伞形应用中通过单条命令针对所有子应用运行 Sobelow,可以在根 mix.exs 文件中为 sobelow 添加别名:
defp aliases do
[
sobelow: ["cmd mix sobelow"]
]
end
如果希望在伞形应用中使用配置文件,请在每个子应用中创建 .sobelow-conf 并使用 --config 标志。
扫描项目时,Sobelow 会偶尔检查更新,并在有新版本可用时打印提醒。Sobelow 通过在扫描项目的根目录创建 .sobelow 文件来记录上次检查更新时间。
如果不需要此功能,可以在扫描时使用 --private 标志。
--private - 跳过更新检查。
--router - 指定路由位置。仅当路由位置非标准时需要。接受路径参数,例如 my/strange/router.ex。
--exit - 在置信度阈值(low、medium 或 high)及以上返回非零退出状态。默认为 false,返回零退出状态。
--threshold - 返回置信度级别(low(默认)、medium 或 high)及以上的发现项。
--format 或 -f - 指定发现输出格式。接受格式,例如 txt 或 json。
注意:--verbose 等选项不适用于 json 格式。所有 json 格式的发现项均包含 type、file 和 line 键。其他键可能有所不同。
--quiet - 返回单行结果,显示发现项数量。若无发现项,则不输出任何内容。
--compact - 紧凑单行发现项,根据置信度着色输出。
--flycheck - 与基于 flycheck 的工具兼容的最小化单行发现项。
--save-config - 基于命令行选项生成配置文件。更多信息见配置文件。
--config - 使用配置文件运行 Sobelow。更多信息见配置文件。
--mark-skip-all - 将所有显示的发现项标记为可跳过。
--clear-skip - 清除由 --mark-skip-all 创建的配置。
--skip - 忽略已标记为跳过的发现项。更多信息见误报。
--version - 输出当前 Sobelow 版本。适用于 CI 步骤或与其他工具(如 Salus)集成。