看起来不良 -

Ahoy,在你的repos-pypi中有恶意是最被滥用的

开源存储库可能是恶意的载体,所以在运行之前要注意。

Ahoy,在你的repos-pypi中有恶意是最被滥用的
盖蒂图片社

假冒软件包从官方Python存储库下载大约5,000次包含的密码,该代码安装了在受感染的机器上安装了加密软件,这是一个安全研究员。

在Pypi存储库上可用的恶意软件包,在许多情况下使用的名称模仿合法性,经常广泛使用的包装,安全公司Sonatype的研究员Ax Sharma报道.所谓的typosquatting攻击成功时,目标偶然输入一个名称,如输入“mplatlib”或“maratlib”,而不是合法和流行的软件包matplotlib

Sharma表示,他发现了6个安装了加密挖矿软件的软件包,这些软件会利用受感染计算机的资源挖掘加密货币,并将其存入攻击者的钱包中。所有6个都是由使用PyPI用户名的人发布的nedog123在某些情况下,早在4月份。包和下载号码是:

  • maratlib: 2371
  • maratlib1: 379
  • matplatlib-plus: 913
  • mllearnlib: 305
  • mplatlib: 318
  • 学会:626.

恶意代码包含在每个包的setup.py文件中。它会导致受感染的计算机使用ubqminer霸王龙Cryptominer挖掘数字货币并将其存入以下地址:0 x510aec7f266557b7de753231820571b13eb31b57

PyPI一直一个经常虐待 存储库自2016年以来,当大学生欺骗17,000名编码器进入运行他在那里发布的粗略脚本。

并不是说PyPI被滥用的次数比其他存储库要多——去年,有成千上万的软件包被下载RubyGems安装了试图拦截比特币支付的恶意软件。两年前,有人在NPM中窃取了一个拥有200万用户的代码库。Sonatype已经追踪超过12,000个恶意NPM包自2019年以来。

人们很容易认为,这些事件中统计的相当一部分下载是自动完成的,从未导致计算机感染,但上述大学生实验的观点却并非如此。他的假冒Python模块在超过1.7万个不同的域名上被执行了4.5万多次,其中一些属于美国政府和军事组织。这种乱交从来都不是一个好主意,但它应该被严格禁止。

73年读者评论

  1. 提醒你,就因为某人可以检查开放源代码中的bug或恶意更改,这并不意味着任何人检查代码。
    |注册了935个帖子
  2. 这就是为什么我们不能有好东西。
    635个帖子|注册
  3. 叹气——只要把我昨天关于勒索软件的评论复制粘贴过来,这样我就不用在这里重新输入了,好吗?

    简而言之:我们不打算修复这个问题,不是因为我们不知道如何修复(在将第三方代码合并到您的项目中之前审计它,托管您自己的已知好的版本,在升级时重复),而是因为这样做的难度和成本对大多数组织来说太大了。

    老实说,有多少开发团队有时间、人才和资源来审核他们的第三方代码供应链,尤其是当你一直在追逐依赖时?我敢打赌,答案非常接近于零,因此没有区别。

    其次,从信誉良好的源代码中获取代码,检查签名,控制版本,只有在有理由这样做的时候才可以升级,但是除非有人在某处执行“审计代码”步骤,否则当类似的事情发生时,你就会陷入困境。
    3002帖子|注册
  4. mewmew写道:
    提醒你,就因为某人可以检查开放源代码中的bug或恶意更改,这并不意味着任何人检查代码。


    这些缺陷不是由检查代码的人发现的吗?:)它更像是:时间可能不适合你的时间表。
    1659帖子|挂号的
  5. mewmew写道:
    提醒你,就因为某人可以检查开放源代码中的bug或恶意更改,这并不意味着任何人检查代码。


    确实。我一直在使用OSS持续集成工具,并考虑企业级版本。我注意到主回购,从源代码编译时,引入了几十个上游项目。因此,我坦率地问他们如何验证上游回购的安全性,以减少供应链攻击。他们在电话中没有回应,他们的首席开发人员也尚未做出回应。

    他们的商业模式从来没有超越销售。
    |注册了87个帖子
  6. 这太疯狂了。如今,每个项目都有巨大的传递依赖性,无法保证拉动的库没有掺假。缺乏每个工件和来源的审计和签名。但是,审计链将尽可能强大。
    599个帖子|注册
  7. mewmew写道:
    fknuckles写道:
    mewmew写道:
    提醒你,就因为某人可以检查开放源代码中的bug或恶意更改,这并不意味着任何人检查代码。


    这些缺陷不是由检查代码的人发现的吗?:)它更像是:时间可能不适合你的时间表。


    微笑着你不知道的随意的人是令人毛骨悚然的。

    但我的观点是,开源并不自然意味着任何一致性被审查,任何一项可以假设闭合源代码被审查。假设开放来源纯粹是犹豫不决的习惯,这是一种糟糕的习惯,借助于检验的代码是神奇的,使得大量的人实际上正在做员工的假设。


    微笑是一个基本的人类非言语线索之一。它通常意味着“我没有敌对意图”。

    你更广泛的观点是有意义的,但细微之处在你最初的总结中被忽略了,我只是在强调这一点。

    我陈述显而易见的事实,但更有可能的是开源软件正在检查,因为代码提供给更多的人,但是多长时间,以及如何严格做的是未定义的,正如你指出的那样,你不能假设它是更安全或可靠的因为这个原因。

    这是一个似乎将变得越来越迫切需要解决的问题。
    1659帖子|挂号的
  8. mewmew写道:
    提醒你,就因为某人可以检查开放源代码中的bug或恶意更改,这并不意味着任何人检查代码。


    确实如此,但考虑到这里的攻击(寻找输入错误的包),更好的问题是您是否检查了正确的开源包?
    |注册了480篇帖子
  9. jhodge写道:
    叹气——只要把我昨天关于勒索软件的评论复制粘贴过来,这样我就不用在这里重新输入了,好吗?

    简而言之:我们不打算修复这个问题,不是因为我们不知道如何修复(在将第三方代码合并到您的项目中之前审计它,托管您自己的已知好的版本,在升级时重复),而是因为这样做的难度和成本对大多数组织来说太大了。

    老实说,有多少开发团队有时间、人才和资源来审核他们的第三方代码供应链,尤其是当你一直在追逐依赖时?我敢打赌,答案非常接近于零,因此没有区别。

    其次,从信誉良好的源代码中获取代码,检查签名,控制版本,只有在有理由这样做的时候才可以升级,但是除非有人在某处执行“审计代码”步骤,否则当类似的事情发生时,你就会陷入困境。


    我同意你对现状的总结——特别是作为PyPI上一些比较流行的软件包的维护者,缺乏公司花钱支持他们的供应链——但我认为你的结论有点太宿命了。我们解决不了这个问题使用当前模型,但是我们可以大大改变游戏:Python打包社区已经在研究如何用一些非可执行的东西(例如pyproject.toml)取代setup.py,我们可以在不同程度的痛苦中从沙箱和检查中获得很多好处。

    例如,对使用exec、ctypes或subprocess的包有不同的安装要求,或者在MacOS、Windows、Linux上使用沙箱框架,等等,所以你可以“pip install foo”为任何不想访问任意文件,但需要某种额外的批准,以允许文件系统访问外部的项目目录或运行其他进程。我想知道是否存在某种污染机制,即您必须在包中声明所需的特权,并使用沙箱策略只允许声明的访问,并使用一些社区努力来迁移现有的包。

    我并不是说这很容易,但我认为摆脱这种局面的唯一方法是改变模型,使其不那么不平衡。这有点像我们没有告诉每个人开车时要小心,而是通过立法规定安全玻璃,更好的刹车,安全气囊等来减少汽车死亡事故。
    2402个帖子|注册
  10. jhodge写道:
    叹气——只要把我昨天关于勒索软件的评论复制粘贴过来,这样我就不用在这里重新输入了,好吗?

    简而言之:我们不打算修复这个问题,不是因为我们不知道如何修复(在将第三方代码合并到您的项目中之前审计它,托管您自己的已知好的版本,在升级时重复),而是因为这样做的难度和成本对大多数组织来说太大了。

    老实说,有多少开发团队有时间、人才和资源来审核他们的第三方代码供应链,尤其是当你一直在追逐依赖时?我敢打赌,答案非常接近于零,因此没有区别。

    其次,从信誉良好的源代码中获取代码,检查签名,控制版本,只有在有理由这样做的时候才可以升级,但是除非有人在某处执行“审计代码”步骤,否则当类似的事情发生时,你就会陷入困境。


    我希望有更多的标准库。c++, Java和Go都有好的和丰富的。这与javascript的精神背道而驰,但它会有所帮助(我认为)。
    5701个帖子|注册
  11. jhodge写道:
    叹气——只要把我昨天关于勒索软件的评论复制粘贴过来,这样我就不用在这里重新输入了,好吗?

    简而言之:我们不打算修复这个问题,不是因为我们不知道如何修复(在将第三方代码合并到您的项目中之前审计它,托管您自己的已知好的版本,在升级时重复),而是因为这样做的难度和成本对大多数组织来说太大了。

    老实说,有多少开发团队有时间、人才和资源来审核他们的第三方代码供应链,尤其是当你一直在追逐依赖时?我敢打赌,答案非常接近于零,因此没有区别。

    其次,从信誉良好的源代码中获取代码,检查签名,控制版本,只有在有理由这样做的时候才可以升级,但是除非有人在某处执行“审计代码”步骤,否则当类似的事情发生时,你就会陷入困境。


    完全正确。我曾参与将一家初创公司的代码出售给一家财富500强公司。大公司iirc雇佣了一家安全公司来审计我们使用的每一个图书馆。因此,我在代码库中递归地编译了每个库的列表。结果是,我们有大约100个库直接链接,但递归计数超过10,000。作为一个初创公司,我们根本不可能去看,或者花钱雇人去看。你必须是一家富有的公司才能做到这一点(将此作为最佳实践归功于买家)。

    但是,那些说“每个图书馆都要查”的人从来没有真正去做过,或者他们在一家资金雄厚的公司工作。并不是所有人都在这种情况下编写代码。
    2895帖子|挂号的
  12. adamsc写道:
    jhodge写道:
    叹气——只要把我昨天关于勒索软件的评论复制粘贴过来,这样我就不用在这里重新输入了,好吗?

    简而言之:我们不打算修复这个问题,不是因为我们不知道如何修复(在将第三方代码合并到您的项目中之前审计它,托管您自己的已知好的版本,在升级时重复),而是因为这样做的难度和成本对大多数组织来说太大了。

    老实说,有多少开发团队有时间、人才和资源来审核他们的第三方代码供应链,尤其是当你一直在追逐依赖时?我敢打赌,答案非常接近于零,因此没有区别。

    其次,从信誉良好的源代码中获取代码,检查签名,控制版本,只有在有理由这样做的时候才可以升级,但是除非有人在某处执行“审计代码”步骤,否则当类似的事情发生时,你就会陷入困境。


    我同意你对现状的总结——特别是作为PyPI上一些比较流行的软件包的维护者,缺乏公司花钱支持他们的供应链——但我认为你的结论有点太宿命了。我们解决不了这个问题使用当前模型,但是我们可以大大改变游戏:Python打包社区已经在研究如何用一些非可执行的东西(例如pyproject.toml)取代setup.py,我们可以在不同程度的痛苦中从沙箱和检查中获得很多好处。

    例如,对使用exec、ctypes或subprocess的包有不同的安装要求,或者在MacOS、Windows、Linux上使用沙箱框架,等等,所以你可以“pip install foo”为任何不想访问任意文件,但需要某种额外的批准,以允许文件系统访问外部的项目目录或运行其他进程。我想知道是否存在某种污染机制,即您必须在包中声明所需的特权,并使用沙箱策略只允许声明的访问,并使用一些社区努力来迁移现有的包。

    我并不是说这很容易,但我认为摆脱这种局面的唯一方法是改变模型,使其不那么不平衡。这有点像我们没有告诉每个人开车时要小心,而是通过立法规定安全玻璃,更好的刹车,安全气囊等来减少汽车死亡事故。



    这肯定会有所帮助,但它仍然使代码库本身容易受到太阳风式的攻击。如果开发人员安装了一个有毒的库,并将其推送到产品web服务器上,即使代码是沙箱化的,这仍然是一个巨大的问题。它将有http访问和连接到一个数据库服务器。游戏结束了。通过加密攻击来阻止更多驱动是很好的,但我不确定我们如何在不损害生产力的情况下真正解决这个问题。

    也许是一些被认可和审查过的已知好的库和版本的白名单?这肯定是棘手和不愉快的。
    2895帖子|挂号的
  13. mewmew写道:

    微笑着你不知道的随意的人是令人毛骨悚然的。


    图像
    13691帖子|注册
  14. 有PyPI,还有Conda/Mamba频道,它们位于通常发行版特定的存储库之上。与PyPI不同,conda不仅仅用于python环境/包管理,例如Bioconda通道也提供了常用的生物信息包的二进制文件。这些渠道通常是由人们在空闲时间管理的,没有任何经济激励。

    有些东西在他们的雷达下被发现的可能性是相当高的,因为他们不可能在一个小的版本改变或其他小的事情之后调查每个食谱,而且大多数食谱都与上游联系在一起(这引入了另一个问题,例如:整个gentoo崩溃)。

    我猜最终会有一个先发制人的“反病毒”,因为围绕着软件包及其来源的复杂的工具链。

    编辑:-不是我喜欢另一个程序在系统中引入更多漏洞的想法,但正如上面所讨论的,向量像有毒的库是相当难以管理的,需要一些主动防御他们。
    |注册了45个帖子
  15. 所以…是时候开始严格执行requirements.txt文件的使用了?
    58个帖子|注册
  16. mewmew写道:
    提醒你,就因为某人可以检查开放源代码中的bug或恶意更改,这并不意味着任何人检查代码。

    是的,这是我经常对那些经常宣传某个开源软件而妖魔化另一个因为它是封闭源代码的人的评论。

    没有人会完全检查他们运行的所有代码。没有时间了。所以在大多数情况下,你假设别人有——软件经常有一个“别人的问题”领域。在封闭源代码中,你会假设公司中有人要负责检查代码,而公司(在某种程度上)应该对此负责。有了开源,你只需假设别人已经看过了。问题是,大多数人都假设了这一点,所以很少有人关注它,除了那些积极进取的人,他们也可能是坏人四月的故事当两名大学研究人员试图故意为一篇论文提交错误代码时)。

    事实证明,一些非常重要的CodeBases不会让他们的来源读取许多 - 那里有多长时间?(26个月!)

    谁要承担责任?没有一个人。因为在很多情况下很难知道这是有意的还是偶然的,或者在某些情况下谁贡献了代码。没人负责,除了你自己,这意味着你必须阅读所有代码,没人有时间做这些。
    2192帖子|挂号的
  17. fknuckles写道:
    mewmew写道:
    提醒你,就因为某人可以检查开放源代码中的bug或恶意更改,这并不意味着任何人检查代码。


    这些缺陷不是由检查代码的人发现的吗?:)它更像是:时间可能不适合你的时间表。

    完全正确。这就是为什么药物需要一段时间才能被批准(或拒绝)。

    用“Vetted by [name]”标记某些版本,其中[name]是一个信誉良好的代码检查人员的名字,他仔细检查了上次审查以来的所有更改。
    优秀的检查员最终会在此基础上建立起声誉,甚至是职业生涯。
    1117个帖子|注册
  18. 引用:
    这种乱交从来都不是一个好主意,但它应该被严格禁止。


    这句话出乎意料。你是在提议法律惩罚吗?是针对黑客还是针对包装消费者?

    或者你只是说应该有组织政策来反对使用OSS包回购?或者每一行进厂包裹的代码都需要检查?
    |注册了1860个帖子
  19. 这是标题图像中的一些时髦的Python代码。Python 4000看起来很像Java!
    429帖子|挂号的
  20. mewmew写道:
    ...没人负责,除了你自己,这意味着你必须阅读所有代码,没人有时间做这些。


    你的意思是,“没有人想花时间”。在这里,“一个”将是你或你的组织等。我觉得这是具有现代软件开发的大缺陷之一。每个人都在赛车,尽快让“最低可行的产品”出门。然后震惊他们的手震惊,漏洞不可否告。

    我现在要打老人牌了。我是在c/c++/asm上入门的。如果你想重用代码,你必须手动输入或剪切/粘贴进去。我觉得这让您对代码中发生的事情有了更深刻的认识。类似于你如何更好地理解一个问题,如果你把它写出来,而不是把它记在脑子里。但我知道,那些日子已经过去了。我承认我在几年前的一个Android开发课上受到了一点文化冲击,在课上我们被告知如何(并且被要求)使用依赖注入。我对此非常震惊;自动从Internet抓取代码,而不查看和编译到我的项目?!疯了。 I can only assume that kind of use of third party code is a big part of the modern day CS teaching.

    就文章而言,这些都是由于拼写错误造成的。这似乎只有在人类层面才能被治愈,因为缺少某种暗示正确回购的智能感知。
    |注册了107个帖子
  21. 让我们面对它,这并不奇怪。当然我可以检查我下载的一些存储库,但我会回答很可能没有。时间限制,熟悉代码和语言都会显着减慢,仍然无法保证您将捕获它。

    案例和要点,我知道C,但如果有人做类似的事情 http://www.underhanded-c.org/ 我相信随便检查一下是不会发现什么恶意的东西的。在某些例子中,我知道其中有一些不好的内容,因为这是一场比赛,但直到他们解释了我才明白。
    |注册了193个帖子
  22. mewmew写道:
    提醒你,就因为某人可以检查开放源代码中的bug或恶意更改,这并不意味着任何人检查代码。


    恶意代码嵌入了文件中setup.py.很多人在检查代码的时候会跳过或者只是快速浏览一下。它有将近400行设置的东西。什么有趣的。实际上,恶意代码可能只是几行import语句。谁有时间去看啊?在进行代码审查时,任何人都很难发现它。

    几年前,有人发现Perl的CPAN存储库有一个活跃的漏洞。该漏洞不在模块代码中,而是在安装期间运行的测试代码中。最疯狂的是测试代码没有改变,但是测试代码从远程服务器下载了一个文件。最初,那个文件不是一个漏洞。但是,接管服务器的人篡改了那个文件来利用漏洞。

    仅仅是“开源”,每个人都能看到代码是不够的。不是所有的开发人员都可以花时间和费用检查每一行代码。
    |注册了2416个帖子
  23. fknuckles写道:
    mewmew写道:
    提醒你,就因为某人可以检查开放源代码中的bug或恶意更改,这并不意味着任何人检查代码。


    这些缺陷不是由检查代码的人发现的吗?:)它更像是:时间可能不适合你的时间表。

    审计已经在这里了——它们只是分布得不是很均匀?
    1240个帖子|注册
  24. 请原谅我的无知——真的——但是如果恶意包托管在官方Python存储库中,这难道不是一个相当容易解决的问题(如果是长期的)吗?

    官方储存库的维护者可以不允许不受信任的程序员的捐款。不受信任的程序员可以为另一个,更高的风险贡献贡献。

    如何让程序员变得可信,我留给读者作为练习,但原则上这似乎很简单,如果与开源精神相悖的话。

    在我看来,Python是一种高风险的、被广泛使用的语言,任何老yahoo都没有理由能够发布输入型软件包。
    2个帖子|注册
  25. 明确的写道:
    adamsc写道:
    jhodge写道:
    叹气——只要把我昨天关于勒索软件的评论复制粘贴过来,这样我就不用在这里重新输入了,好吗?

    简而言之:我们不打算修复这个问题,不是因为我们不知道如何修复(在将第三方代码合并到您的项目中之前审计它,托管您自己的已知好的版本,在升级时重复),而是因为这样做的难度和成本对大多数组织来说太大了。

    老实说,有多少开发团队有时间、人才和资源来审核他们的第三方代码供应链,尤其是当你一直在追逐依赖时?我敢打赌,答案非常接近于零,因此没有区别。

    其次,从信誉良好的源代码中获取代码,检查签名,控制版本,只有在有理由这样做的时候才可以升级,但是除非有人在某处执行“审计代码”步骤,否则当类似的事情发生时,你就会陷入困境。


    我同意你对现状的总结——特别是作为PyPI上一些比较流行的软件包的维护者,缺乏公司花钱支持他们的供应链——但我认为你的结论有点太宿命了。我们解决不了这个问题使用当前模型,但是我们可以大大改变游戏:Python打包社区已经在研究如何用一些非可执行的东西(例如pyproject.toml)取代setup.py,我们可以在不同程度的痛苦中从沙箱和检查中获得很多好处。

    例如,对使用exec、ctypes或subprocess的包有不同的安装要求,或者在MacOS、Windows、Linux上使用沙箱框架,等等,所以你可以“pip install foo”为任何不想访问任意文件,但需要某种额外的批准,以允许文件系统访问外部的项目目录或运行其他进程。我想知道是否存在某种污染机制,即您必须在包中声明所需的特权,并使用沙箱策略只允许声明的访问,并使用一些社区努力来迁移现有的包。

    我并不是说这很容易,但我认为摆脱这种局面的唯一方法是改变模型,使其不那么不平衡。这有点像我们没有告诉每个人开车时要小心,而是通过立法规定安全玻璃,更好的刹车,安全气囊等来减少汽车死亡事故。



    这肯定会有所帮助,但它仍然使代码库本身容易受到太阳风式的攻击。如果开发人员安装了一个有毒的库,并将其推送到产品web服务器上,即使代码是沙箱化的,这仍然是一个巨大的问题。它将有http访问和连接到一个数据库服务器。游戏结束了。通过加密攻击来阻止更多驱动是很好的,但我不确定我们如何在不损害生产力的情况下真正解决这个问题。

    也许是一些被认可和审查过的已知好的库和版本的白名单?这肯定是棘手和不愉快的。


    这绝对不是完美的,但它会让防守者更容易一些,比如,你安装的每个库都有一个清单,上面说它是否需要网络或文件系统访问,以及需要访问的范围,所以你可以更多地关注那些需要访问的,特别是当一个库更改访问级别时,作为一个新版本的一部分。即使进程本身需要发出网络请求,这并不一定意味着该进程中使用的100个库都需要这样做。它会特别有趣如果你能下来范围水平,它可以被用来产生更多微妙的系统级沙盒工具或代理政策(“我需要网络访问但只有端口443 * .googleapis.com”或“我需要文件系统访问,但只有阅读x509 CA存储和配置文件”)。

    Solarwinds几乎是最难抵御的案例,因为它被完全受到损害这类软件需要非常广泛的访问级别。我肯定会考虑如何阻止这种情况的发生,但我认为,如果采取措施,既不阻止这种情况,又能更容易地捕获,同时阻止云凭证/加密钱包驱动攻击等更容易的事情,那么这些措施仍有很大的价值。
    2402个帖子|注册
  26. “这种乱交从来都不是一个好主意,但应该严格禁止。”

    如何?其中一些包的名字有点生硬。而且它们都托管在一个“可信的”存储库站点上。

    我可以在我的客户端上启用哪些功能将“禁止”它从下载这些损坏的包裹?他们没有签名吗?(签署了多少合法包?)。说真的 - 我如何配置我的PC(或PI),以便此内容不偶然被拉下来?

    我需要一个苹果控制的图书馆“商店”吗?: - p

    在VS(和Code)中,我使用/nuget/之类的东西来下载库,有时还会下载插件(用于Code)。我读了出版商的声明,看看是否有签名。我倾向于相信来自微软和牛顿软件的那些软件——但其他我从未听说过的软件(特别是代码扩展)。

    对于NPM,我下载了一个“看似可信的”包。但这可能会增加一个新的依赖。npm安装婴儿。有些事情我甚至不知道(是的,我们经常检查npm审计的结果)。
    475个帖子|注册
  27. 这是标题图像中的一些时髦的Python代码。Python 4000看起来很像Java!

    真的吗?因为我认为它看起来很像Visual Basic!
    732个帖子|注册
  28. 解决这个问题的工具越来越多。主要归结为“我们将为您审查软件包,我们的软件包管理器只允许您下载我们认为是安全的代码”。另一种选择就是要小心。不要随意升级到最新版本。检查您试图下载的软件包是否有拼写错误。

    免费的公共软件包管理器是一件好事,但是对于企业来说它们是有风险的,就像你从网上下载的其他软件一样,需要小心。
    558帖子|挂号的
  29. Powerlord写道:
    这是标题图像中的一些时髦的Python代码。Python 4000看起来很像Java!

    真的吗?因为我认为它看起来很像Visual Basic!

    我想知道为什么1不是质数。撇除1的Prime定义似乎相当随意。

    编辑:维基百科实际上有在这个节
    引用:
    原始的

    大多数早期的希腊人甚至不认为1是数字[36][37],所以他们不认为1是原始数字。从那时起,一些数学家也认为质数是奇数的细分,所以他们也不认为2是质数。然而,欧几里得和大多数其他希腊数学家认为2是质数。中世纪的伊斯兰数学家在很大程度上沿袭了希腊人的观点,认为1不是数字到了中世纪和文艺复兴时期,数学家们开始把1当作一个数,有些人还把它当作第一个质数[38]18世纪中期,克里斯蒂安·哥德巴赫在与莱昂哈德·欧拉的通信中把1列为质数;但是欧拉自己并不认为1是质数[39]在19世纪,许多数学家仍然认为1是质数,[40]和包含1的质数列表直到1956年还在继续发表

    如果将质数的定义改为称1为质数,那么涉及质数的许多表述将需要以一种更尴尬的方式重新表述。例如,算术基本定理将需要按照分解为大于1的质数的方式来重新表述,因为每个数都会有多个1.[40]的副本类似地,如果将1作为质数处理,埃拉托色尼的筛子也不能正常工作,因为它会排除1的所有倍数(即所有其他数字),只输出单个数字1.[42]素数的一些其他更技术性的性质也不适用于数字1:例如,欧拉的全因子函数或因子和函数的公式对于素数来说与对于1.[43]是不同的到了20世纪初,数学家们开始同意1不应该被列为质数,而应该被列为一个特殊的“单位”
    7653帖子|注册
  30. npm和PyPI当然可以更新他们的客户端,这样当你试图下载一个看起来像另一个流行的包,但下载量少得多的包时,他们就会发出响亮的警告。它们还可能要求新软件包的名称与流行软件包的名称非常不同。
    558帖子|挂号的
  31. 我一直不明白,为什么每个人都不喜欢从左到右导入依赖项,而且通常不是根据具体的版本号,而是“最新的”。

    我们只使用特定的版本号并在我们的构建系统中我们主持重要内容。是的,它不会阻止进入供应链的坏代码,但如果我们总是在断开的副本落后一年,我们就不太可能是患者零。
    |注册了269篇帖子
  32. mewmew写道:
    提醒你,就因为某人可以检查开放源代码中的bug或恶意更改,这并不意味着任何人检查代码。


    这听起来像是一个很好的理由,让某些人创建一个开源审计组。
    |注册了1146个帖子
  33. foobarian写道:
    免费的公共软件包管理器是一件好事,但是对于企业来说它们是有风险的,就像你从网上下载的其他软件一样,需要小心。

    人们可以假定,一个企业在开发项目时,较高的预算和较长的时间范围也说明要仔细检查所有内部和第三方组成部分。

    但这种假设往往是错误的。
    1117个帖子|注册
  34. 危险孔写道:
    我一直不明白,为什么每个人都不喜欢从左到右导入依赖项,而且通常不是根据具体的版本号,而是“最新的”。

    我们只使用特定的版本号并在我们的构建系统中我们主持重要内容。是的,它不会阻止进入供应链的坏代码,但如果我们总是在断开的副本落后一年,我们就不太可能是患者零。


    我在“自动下载任何依赖并运行它,因为它被请求”,而不是“失败在$ dependency没有安装在本地环境”或可能“失败在$ dependency没有在本地网络repo”。这肯定就是这里发生的事,对吧?天啊,看起来又懒又笨。

    至少你可以有一个输入白名单的linter,对吧?
    49个帖子|挂号的
  35. 我能看到的唯一办法是缓解这是你有一个第三方拉库,做一些自动和手动扫描的代码,你支付服务之前,你从第三方下载。问题是,有太多的图书馆,他们只能处理300个最流行的图书馆。

    我知道即使是我自己,有时候我想做一个实验,看看如果可以工作,我需要做的很快,我不会需要天审查代码只是为了一个30分钟的努力是否会做我想做的事。

    这类问题不会像目前的结构那样消失。
    440个帖子|注册
  36. adamsc写道:
    jhodge写道:
    叹气——只要把我昨天关于勒索软件的评论复制粘贴过来,这样我就不用在这里重新输入了,好吗?

    简而言之:我们不打算修复这个问题,不是因为我们不知道如何修复(在将第三方代码合并到您的项目中之前审计它,托管您自己的已知好的版本,在升级时重复),而是因为这样做的难度和成本对大多数组织来说太大了。

    老实说,有多少开发团队有时间、人才和资源来审核他们的第三方代码供应链,尤其是当你一直在追逐依赖时?我敢打赌,答案非常接近于零,因此没有区别。

    其次,从信誉良好的源代码中获取代码,检查签名,控制版本,只有在有理由这样做的时候才可以升级,但是除非有人在某处执行“审计代码”步骤,否则当类似的事情发生时,你就会陷入困境。


    我同意你对现状的总结——特别是作为PyPI上一些比较流行的软件包的维护者,缺乏公司花钱支持他们的供应链——但我认为你的结论有点太宿命了。我们解决不了这个问题使用当前模型,但是我们可以大大改变游戏:Python打包社区已经在研究如何用一些非可执行的东西(例如pyproject.toml)取代setup.py,我们可以在不同程度的痛苦中从沙箱和检查中获得很多好处。

    例如,对使用exec、ctypes或subprocess的包有不同的安装要求,或者在MacOS、Windows、Linux上使用沙箱框架,等等,所以你可以“pip install foo”为任何不想访问任意文件,但需要某种额外的批准,以允许文件系统访问外部的项目目录或运行其他进程。我想知道是否存在某种污染机制,即您必须在包中声明所需的特权,并使用沙箱策略只允许声明的访问,并使用一些社区努力来迁移现有的包。

    我并不是说这很容易,但我认为摆脱这种局面的唯一方法是改变模型,使其不那么不平衡。这有点像我们没有告诉每个人开车时要小心,而是通过立法规定安全玻璃,更好的刹车,安全气囊等来减少汽车死亡事故。


    不要忘记那些不引用依赖于另一个库的库,而是在它们自己的库中包,而不是在旁边。
    22562帖子|挂号的
  37. 所有的道路都通向他们自己的依赖地狱。

    Pypi至少应该有两个独立的存储库:一个仅限于已建立的包,另一个开放的,用户可以在其中自行安装包。默认模式应该是访问已建立的repo中的代码,安装需要一个特定的标志来允许来自开放包存储库的依赖关系。这并不能解决问题,但至少让非营利组织更容易管理这个问题,并激励行业捐赠资金以确保pypi的安全。
    495个帖子|注册
  38. jhodge写道:
    叹气——只要把我昨天关于勒索软件的评论复制粘贴过来,这样我就不用在这里重新输入了,好吗?

    简而言之:我们不打算修复这个问题,不是因为我们不知道如何修复(在将第三方代码合并到您的项目中之前审计它,托管您自己的已知好的版本,在升级时重复),而是因为这样做的难度和成本对大多数组织来说太大了。

    老实说,有多少开发团队有时间、人才和资源来审核他们的第三方代码供应链,尤其是当你一直在追逐依赖时?我敢打赌,答案非常接近于零,因此没有区别。

    其次,从信誉良好的源代码中获取代码,检查签名,控制版本,只有在有理由这样做的时候才可以升级,但是除非有人在某处执行“审计代码”步骤,否则当类似的事情发生时,你就会陷入困境。



    这听起来像我们需要一个数字公共卫生部,有代码检查员,如现有的公共卫生部的食品安全,X射线设备和其他检查员!
    |注册了1860个帖子

你必须置评。

通道Ars Technica