Safety:如何检测已安装依赖组件中的已知安全漏洞

2020-12-08 15:57:21 浏览数 (1)

Safety

Safety是一款功能强大的漏洞检测工具,可以帮助广大研究人员检测设备上已安装依赖组件中存在的已知安全漏洞。默认配置下,Safety使用的是开放Python漏洞数据库-Safety DB,但是大家也可以使用—key选项来更新工具,并使用pyup.io的Safety API

工具安装

我们可以使用pip来安装Safety,不过请大家记住,当前版本的Safety仅支持Python 3.5及其更高版本的环境:

代码语言:javascript复制
pip install safety

工具使用

运行下列命令,即可判断当前以选择的安装了依赖组件的虚拟环境,并检测已知的安全漏洞:

代码语言:javascript复制
safety check

运行之后,我们将看到如下图所示的报告界面:

现在,我们来安装一些存在安全问题的依赖组件:

代码语言:javascript复制
pip install insecure-package

接下来,再次运行漏洞检测命令:

代码语言:javascript复制
safety check

这一次的扫描结果如下:

工具使用样例

读取工具所需文件

跟pip一样,Safety能够读取本地requirement文件:

代码语言:javascript复制
safety check -r requirements.txt

从Stdin读取

Safety还能够使用—stdin参数来从Stdin读取输入数据。如需检测一个本地依赖文件,可运行下列命令:

代码语言:javascript复制
cat requirements.txt | safety check --stdin

或者,从pip freeze的输出读取输入:

代码语言:javascript复制
pip freeze | safety check --stdin

或者,检测一个单一依赖包:

代码语言:javascript复制
echo "insecure-package==0.1" | safety check --stdin

在Docker中使用Safety

Safety还能够以Docker容器的形式运行:

代码语言:javascript复制
echo "insecure-package==0.1" | docker run -i --rm pyupio/safety safety check --stdin

cat requirements.txt | docker run -i --rm pyupio/safety safety check --stdin

使用Safety源码

Safety的源代码还提供了某些额外的安全功能,安装完成之后,我们就能够使用常规命令行版本的Safety了。点击【这里】即可获取Safety源代码。

通过CI服务使用Safety

Safety还能够配合CI管道一起使用,如果扫描到了一个漏洞的话,它会返回一个非零退出状态。

Travis:

代码语言:javascript复制
install:

  - pip install safety

script:

  - safety check

Gitlab CI:

代码语言:javascript复制
safety:

  script:

    - pip install safety

- safety check

Tox:

代码语言:javascript复制
[tox]

envlist = py37

[testenv]

deps =

    safety

    pytest

commands =

    safety check

Pytest

深度GitHub整合

如果你想要将Safety跟你自己的GitHub库进行深度整合的话,可以直接使用pyup.io中的Safety服务,即Safety CI。Safety CI能够检测GitHub库中依赖组件的commit和pull request,并寻找已知的安全漏洞,并将检测结果和状态显示在GitHub中。

在产品中使用Safety

Safety是免费且开源的,它的底层开放数据库每个月还会更新一次。为了访问到所有最新添加进去的安全漏洞,我们需要使用一个Safety API密钥以及一个付费的pyup.io账号(约99美元)。

工具选项

—key

即pyup.io的漏洞数据库API密钥,需要在SAFETY_API_KEY环境变量中设置:

代码语言:javascript复制
safety check --key=12345-ABCDEFGH

—db

指向本地数据库的目录路径,其中包括insecure.json和insecure_full.json:

代码语言:javascript复制
safety check --db=/home/safety-db/data

—proxy-host

代理主机的IP或DNS

代码语言:javascript复制
--proxy-port

代理端口号

代码语言:javascript复制
--proxy-protocol

代理协议(https或http)

—json

JSON格式的漏洞报告输出:

代码语言:javascript复制
safety check --json

[

    [

        "django",

        "<1.2.2",

        "1.2",

        "Cross-site scripting (XSS) vulnerability in Django 1.2.x before 1.2.2 allows remote attackers to inject arbitrary web script or HTML via a csrfmiddlewaretoken (aka csrf_token) cookie.",

        "25701"

    ]

]

—full-report

获取完整的漏洞扫描报告,还包括安全建议:

代码语言:javascript复制
safety check --full-report

 ============================================================================== 

|                                                                              |

|                               /$$$$$$            /$$                         |

|                              /$$__  $$          | $$                         |

|           /$$$$$$$  /$$$$$$ | $$  __//$$$$$$  /$$$$$$   /$$   /$$           |

|          /$$_____/ |____  $$| $$$$   /$$__  $$|_  $$_/  | $$  | $$           |

|         |  $$$$$$   /$$$$$$$| $$_/  | $$$$$$$$  | $$    | $$  | $$           |

|          ____  $$ /$$__  $$| $$    | $$_____/  | $$ /$$| $$  | $$           |

|          /$$$$$$$/|  $$$$$$$| $$    |  $$$$$$$  |  $$$$/|  $$$$$$$           |

|         |_______/  _______/|__/     _______/   ___/   ____  $$           |

|                                                          /$$  | $$           |

|                                                         |  $$$$$$/           |

|  by pyup.io                                              ______/            |

|                                                                              |

 ============================================================================== 

| REPORT                                                                       |

 ============================ =========== ========================== ========== 

| package                    | installed | affected                 | ID       |

 ============================ =========== ========================== ========== 

| django                     | 1.2       | <1.2.2                   | 25701    |

 ============================================================================== 

| Cross-site scripting (XSS) vulnerability in Django 1.2.x before 1.2.2 allows |

|  remote attackers to inject arbitrary web script or HTML via a csrfmiddlewar |

| etoken (aka csrf_token) cookie.                                              |

 ============================================================================== 

—bare

仅输出包含漏洞的依赖包,可结合其他工具一起使用:

代码语言:javascript复制
safety check --bare

cryptography django

—cache

漏洞数据库本地缓存,有效时长为两小时:

代码语言:javascript复制
safety check --cache

—stdin

从stdin读取输入数据:

代码语言:javascript复制
cat requirements.txt | safety check --stdin

pip freeze | safety check --stdin

echo "insecure-package==0.1" | safety check --stdin

—output, -o

将扫描结果输出至文件:

代码语言:javascript复制
safety check -o insecure_report.txt

safety check --output --json insecure_report.json

开源许可证协议

本项目的开发与发布遵循MIT开源许可证协议。

项目地址

Safety:https://github.com/pyupio/safety

0 人点赞