我想提供关于Git.php.net安全事件的更新。要简要概括最重要的信息:
我们不再相信Git.php.net服务器已被泄露。但是,Master.php.net用户数据库可能已泄露。
git.php.net和svn.php.net现在都是只读的,但将暂时可用。
以下是更详细地解释发生的事情以及采取的行动。
当第一次恶意提交在Rasmus&#39下制作;姓名,我的初步反应是恢复改变并撤销Rasmus&#39的提交访问;账户,假设这是个人账户妥协。在后智,这个动作没有真正有意义,因为有(当时)没有理由相信推动通过RASMUS'特别是账户。任何具有访问PHP-SRC存储库的帐户都可以在错误的名称下执行推送。
当第二个恶意提交在我自己的名称下进行时,我审查了我们的GitiTITE安装的日志,以便确定哪个帐户实际用于执行推送。但是,虽然所有相邻的提交都被占了,但没有出现两个恶意提交的Git-Receive-Pack条目,这意味着这两个事项提交完全绕过了Gitolite基础架构。这被解释为服务器妥协的可能证据。
不久之后,我们决定停止git.php.net并使github我们的主存储库主机。保留我们自己的Git基础架构在确定妥协的根本原因后,需要设置新的Git.php.net服务器。这将在此期间需要花费大量时间并扰乱PHP开发。对于GitHub的基本迁移可以更快地执行更快,因为大多数存储库已经在那里镜像。在这一点上,无论如何,我们已经经历了大量的发展,我们自己的Git基础设施大多是发行工作流程的安全责任和复杂性,因此制作开关并不是一个艰难的决定。
当时我不知道的东西是Git.php.net(故意)支持不仅通过SSH(使用Gitolite基础架构和公钥加密)而推动更改,还支持通过HTTPS来推动更改。后者没有使用gitiTite,而是使用Git-Http-experend在Apache2摘要身份验证,而不是Master.php.net用户数据库。我不确定为什么首先支持基于密码的身份验证,因为它比Pubkey身份验证的安全得多。
基于访问日志,我们可以确定使用HTTPS和基于密码的身份验证来推动该提交。相关日志条目的摘录如下所示:
[删除] - RASMUS @ [编辑] [27 / Mar / 2021:19:19:23 -0700]" get /push/php-src.git/info/refs?service=git-upload-pack http /1.1" 401 941 [删除] - Rasmus @ [重新迁移] [27 / Mar / 2021:19:19:28 -0700]" get /push/php-src.git/info/refs?service=git-upload-包http / 1.1" 401 941 [编辑] - RASMUS [27 / MAR / 2021:20:56:51 -0700]" get /push/php-src.git/info/refs?service=git-receive-pack http / 1.1 " 200 125315 [编纂] - RASMUS [27 / MAR / 2021:20:58:13 -0700]" POST / push/php-src.git/git-receive-pack http / 1.1" 200 1080 [redacted] - nikita.ppv [28 / mar / 2021:09:09:15 -0700]" get /push/php-src.git/info/refs?service=git-upload-pack http /1.1" 401 941 [redacted] - nikita.ppv [28 / mar / 2021:09:09:18 -0700]" get /push/php-src.git/info/refs?service=git-upload-pack http /1.1" 401 941 [redacted] - nikitappv [28 / mar / 2021:09:09:35 -0700]" get /push/php-src.git/info/refs?service=git-upload-pack http / 1.1 " 401 941 [redacted] - nikitappv [28 / mar / 2021:09:09:36 -0700]" get /push/php-src.git/info/refs?service=git-upload-pack http / 1.1 " 401 941 [删除] - Nikita [28 / Mar / 2021:09:09:50 -0700]" get /push/php-src.git/info/refs?service=git-upload-pack http / 1.1 " 401 941 [删除] - Nikita [28 / Mar / 2021:09:09:53 -0700]" get /push/php-src.git/info/refs?service=git-upload-pack http / 1.1 " 401 941 [删除] - 尼克西[28 / Mar / 2021:09:11:31 -0700]" get /push/php-src.git/info/refs?service=git-receive-pack http / 1.1 " 401 941 [删除] - 尼克西[28 / Mar / 2021:09:11:31 -0700]" get /push/php-src.git/info/refs?service=git-receive-pack http / 1.1 " 401 941 [删除] - 尼克西[28 / mar / 2021:09:13:28 -0700]" get /push/php-src.git/info/refs?service=git-receive-pack http / 1.1 " 200 123263 [redacted] - nikic [28 / mar / 2021:09:13:39 -0700]" post /push/php-src.git/git-receive-pack http / 1.1" 2000年1079.
值得注意的是,攻击者只在用户名下猜测了一些猜测,并在找到正确的用户名后成功验证。虽然我们没有任何特定的证据,但可能的解释是Master.php.net的用户数据库已被泄露,虽然目前尚不清楚为什么攻击者需要在这种情况下猜测用户名。
Master.php.net系统用于身份验证和各种管理任务,在非常旧的操作系统/ PHP版本上运行非常旧的代码,因此某种脆弱性不会非常令人惊讶。我们已经提出了一些更改以增加该系统的安全性:
Master.php.net被迁移到新系统(运行PHP 8)并同时重命名为Main.php.net。除此之外,新系统支持TLS 1.2,这意味着您在访问此站点时不再看到TLS版本警告。
实现已朝向使用参数化查询移动,更自信地无法发生SQL注入。
以前,密码以与HTTP摘要认证兼容的格式存储(基本上是一个普通的MD5哈希),这是Git.php.net和Svn.php.net上的HTTP身份验证所必需的。 由于Git.php.net作为此事件的读取,我们也决定使SVN.PHP.NET读取,从而删除以不安全格式存储密码的需要。 只有一个小少数PECL扩展仍在使用SVN服务器。 以下SVN存储库具有半最近的活动,并已迁移到GitHub: 如果需要额外的迁移或权限调整,请在[email protected]上与我联系。 还请报告您使用main.php.net遇到的任何问题 - 它'很可能在迁移期间发生了一些事情。