产品怎么去track漏洞?在管理supply chain的时候,我们会遇到很多问题。我们知道,一个工厂的流水线机器会安装各种传感器来监测生产环境,那么对于软件的流水线呢?比如build script有没有下载不安全的lib?比如我们的下载源有没有受到攻击提供了不安全的package?首先,我们需要知道的是,build script访问了哪些网站,url分别是什么?
其实我们可以使用第三人攻击的方法,架设一个proxy,然后将所有的网络流量都通过这个proxy。这个proxy可以模拟target网站,然后把信息原封不动地再传递给target。这样自然而然就可以拿到HTTP/HTTPS的url了。对于很多binary protocol,目前还是比较困难的,比如ssh,不是文本,就不能快速解析;像udp就更复杂了。所以为了能达到100%监测,基于现在的技术,我们需要将build script全部使用HTTP/HTTPS进行外部访问。
HTTP proxy很好理解,但是HTTPS有些人肯定会有疑虑,如何能伪装一个网站,并且通过SSL验证。其实这最终就是一个证书配置的问题。我们生成一个根证书去签发所有伪装的网站,只要把这个根证书在需要的地方注册好,让它暂时可信就可以了。当然,这里确实有一些麻烦的地方,对于不同的工具有自己读取并验证根证书的方法,我们要看build script到底使用了哪些工具来进行特别配置。
因为对于HTTPS proxy,不同工具配置不同,如何保证所有流量都route到proxy里面了呢?所有我们可以启用另一个法宝tcpdump,它可以监测所有原始的网络流量;我们可以将它的src和dst的IP都列出来,并且去解析DNS packet得到hostname,这样所有的外网访问都会被列出来。如果有HTTPS没有route到proxy的,tcpdump的报告里就会多出一些未知IP或者hostname。
https://github.com/stallpool/track-network-traffic
从代码来看,其实核心就是一个mitmproxy,它会自动生成一个根证书,然后伪装成各种网站对url进行截取。track-network-traffic的工作主要就是把这个根证书配置到需要的工具里。当然,还需要开启tcpdump功能,让traffic没有漏网之鱼。
我们来看看这个工具的使用状况:
bash ./bin/tnt.bash -o . -- curl https://www.google.com
bash ./bin/tnt.bash -a -o . -- pip install pg8000
当然嫌一个command一个command太麻烦,就写一个bash
cat > all_in_one.sh <<EOF
curl https://www.google.com
pip install pg8000
EOF
bash ./bin/tnt.bash -o . -- bash all_in_one.sh
这样就可以得到诸如下列report.json
{
"items": [
{
"content": "binary",
"host": "www.google.com",
"path": [
"/ HTTP/2.0"
],
"protocol": "https"
},
{
"content": "binary",
"host": "pypi.org",
"path": [
"/simple/pg8000/",
"/simple/scramp/",
"/simple/asn1crypto/"
],
"protocol": "https"
},
{
"content": "binary",
"host": "files.pythonhosted.org",
"path": [
"/packages/0d/b9/0f8e90f4d3785c517b15e1643d58fd484e2b594559d1af37e19217a74817/pg8000-1.22.0-py3-none-any.whl",
"/packages/27/31/80bfb02ba2daa9a0ca66f82650c411f1a2b21ce85164408f57e99aab4e4e/scramp-1.4.1-py3-none-any.whl",
"/packages/b5/a8/56be92dcd4a5bf1998705a9b4028249fe7c9a035b955fe93b6a3e5b829f8/asn1crypto-1.4.0-py2.py3-none-any.whl"
],
"protocol": "https"
}
]
}
对于docker build,我们同样可以配置各种proxy,但是最终的产物image不能对外发布,因为image里多出了一些证书和配置layers。这个其实可以靠强制去除layer chain来解决。比如想要得到docker build的网络访问report
cat > Dockerfile <<EOF
FROM python:2.7.18
RUN curl https://www.google.com
RUN pip install pg8000
EOF
./bin/docker build .
其他就大家自己摸索吧。想要讨论的同学可以注明需要讨论的主题加微信
|