Han*_*etz 7 package-management security
每当系统通知我软件更新时,我都会定期更新我的系统。这是我在不知道细节的情况下只相信工作的事情之一,但我最近变得好奇:我怎么知道
我知道我有一组通过 URL 指定的软件源,并且我是否信任这些源是我的决定。但是一旦我指定了这些 URL 会发生什么?
从现在常见的情况来看,我怀疑这些来源的真实性是通过 HTTPS/SSL 之类的东西来验证的,即我有一些证书是针对某些权威进行验证的,这意味着,我需要在某处安装可靠的根证书(可能它们随系统一起提供)。
此外,我猜这些包是加密签名的,就像 GPG 或类似的一样。
这些假设正确吗?我在哪里可以检查使用的密钥/证书?我如何验证它们是否正确?我如何才能验证它们是否确实被使用过?是否有配置选项使该过程或多或少谨慎,它们的默认值是什么?是否存在已知的攻击,或者最近是否存在漏洞?我似乎记得不久前 Windows 也有类似的问题。
我在 12.04,但我假设这可以得到更普遍的回答。
这是一个很好的问题。答案(当然)相当复杂,但让我尝试为您分解一下。我们先看一下技术流程:
我们不使用 SSL 来保护 APT,我们使用加密哈希(现在是 SHA256)和 OpenPGP 签名。这允许您信任不受信任的镜像,并避免必须信任 CA PKI。
当您将存储库添加到 APT 时sources.list
,还必须使用以下apt-key
命令将其 PGP 密钥添加到 APT 的可信密钥环中。密钥环附带 Ubuntu 存储库的密钥。当您使用该apt-add-repository
命令添加 PPA 时,它会为您添加密钥(通过 SSL 从 Launchpad 获取)。
信任链是:
sources.list
条目都将 APT 指向Release
存储库中的一个文件,并带有Release.gpg
签名(或者它们可以组合为一个InRelease
文件)。该文件描述存储库,并且必须由 APT 密钥环中的密钥进行签名。Release
文件包含所有Packages
和Sources
文件的加密哈希值。这些列出了存储库中可用的所有包和版本。Packages
文件Sources
包含每个包的加密哈希值。您可以在Debian wiki上阅读有关存储库格式的更多信息。
该链意味着我们不必信任任何中间镜像,我们可以相信我们安装的软件包与发布文件签名时存在的软件包相同。
您可以通过运行来检查 APT 的密钥环sudo apt-key finger
。
你怎么知道那里应该有什么?如果您不信任您的计算机,您就无法信任计算机上的任何程序不会对您撒谎(例如apt-key
),并且此练习是徒劳的。因此,我们假设这只是出于学术兴趣,并从最终的源包中验证密钥环的内容,该源包是由上传它的开发人员签名的 PGP。
下载ubuntu-keyring
源码包,看看里面应该有什么:
$ apt-get source ubuntu-keyring
Reading package lists... Done
Building dependency tree
Reading state information... Done
Need to get 20.0 kB of source archives.
Get:1 http://localhost/ubuntu/ quantal/main ubuntu-keyring 2012.05.19 (dsc) [1542 B]
Get:2 http://localhost/ubuntu/ quantal/main ubuntu-keyring 2012.05.19 (tar) [18.5 kB]
Fetched 20.0 kB in 0s (0 B/s)
dpkg-source: info: extracting ubuntu-keyring in ubuntu-keyring-2012.05.19
dpkg-source: info: unpacking ubuntu-keyring_2012.05.19.tar.gz
$ gpg --verify ubuntu-keyring_2012.05.19.dsc
gpg: Signature made Sat May 19 03:33:12 2012 SAST
gpg: using RSA key 0x393587D97D86500B
gpg: Good signature from "Colin Watson <cjwatson@chiark.greenend.org.uk>"
gpg: aka "Colin Watson <cjwatson@debian.org>"
gpg: aka "Colin Watson <cjwatson@ubuntu.com>"
gpg: aka "Colin Watson <cjwatson@canonical.com>"
$ gpg --no-default-keyring --keyring ubuntu-keyring-2012.05.19/keyrings/ubuntu-archive-keyring.gpg --fingerprint
ubuntu-keyring-2012.05.19/keyrings/ubuntu-archive-keyring.gpg
-------------------------------------------------------------
pub 1024D/0x40976EAF437D05B5 2004-09-12
Key fingerprint = 6302 39CC 130E 1A7F D81A 27B1 4097 6EAF 437D 05B5
uid Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>
sub 2048g/0x251BEFF479164387 2004-09-12
pub 1024D/0x46181433FBB75451 2004-12-30
Key fingerprint = C598 6B4F 1257 FFA8 6632 CBA7 4618 1433 FBB7 5451
uid Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com>
pub 4096R/0x3B4FE6ACC0B21F32 2012-05-11
Key fingerprint = 790B C727 7767 219C 42C8 6F93 3B4F E6AC C0B2 1F32
uid Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>
pub 4096R/0xD94AA3F0EFE21092 2012-05-11
Key fingerprint = 8439 38DF 228D 22F7 B374 2BC0 D94A A3F0 EFE2 1092
uid Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>
Run Code Online (Sandbox Code Playgroud)
我知道这实际上是 Colin Watson 的签名,因为我已经见过他好几次了,我们已经验证了彼此的身份并签署了彼此的密钥。如果你在 PGP 强集中有一个密钥,你应该能够找到他的信任路径。我也知道我可以相信他会上传正确的ubuntu-keyring
包。
对于 Debian,有一个包 ( debian-keyring
) 包含所有 Debian 开发人员的 PGP 密钥,您可以使用它来验证源包签名。Ubuntu 没有类似的工具,但许多 Ubuntu 开发人员也是 Debian 开发人员,并且我们所有开发人员的 PGP 密钥都可以在 Launchpad 的个人资料中找到。
我如何知道更新不是恶意的?
这归结为信任。您必须完全信任您使用的每个存储库。您授予每个存储库的维护者以 root 身份在您的计算机上运行内容的权限。
Ubuntu 软件包只能由已获得开发者会员委员会(我目前在该委员会任职)授予上传权限的 Ubuntu 开发者上传。要申请上传权,您必须得到几位与您合作过的现有 Ubuntu 开发人员的支持,并且相信您独立工作的能力。如果没有上传权限,则上传必须由拥有权限的开发者赞助(应包括对上传的审核)。
对于发布后的更新,Ubuntu对更新的内容有严格的政策。它们应该只包含最少的补丁来修复已知的错误。补丁在被接受之前会经过 SRU/安全团队成员的审查。
显然,PPA 和第三方存储库没有所有这些限制。您必须相信购电协议所有者是明智的。
所有 Ubuntu 和 PPA 软件包都有可用的源代码,因此任何人都可以检查它们。
是否有配置选项使该过程或多或少谨慎,它们的默认值是什么?
您可以在 APT 中关闭签名验证,但当然默认情况下它是打开的。当您尝试从未签名/不受信任的存储库安装某些内容时,apt 会让您确认您确实想要执行此操作。
是否存在已知的攻击,或者最近是否存在漏洞?
我记得一个,Debian bug 499897。Debian 通过给发布文件一个到期日来解决这个问题,到期后它们将不再可信。Ubuntu还不支持这个。