没有坏处,

啊哈,你的储存库里有恶意——pypi是最新被滥用的

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

啊哈,你的储存库里有恶意——pypi是最新被滥用的
盖蒂图片社

一名安全研究人员发现,从官方Python存储库中下载约5000次的假冒软件包包含在受感染机器上安装加密软件的秘密代码。

安全公司Sonatype的研究员Ax Sharma说,这些恶意包可以在PyPI存储库中找到,在很多情况下,它们使用的名称模仿了那些已经在PyPI存储库中广泛使用的合法包的名称报道.所谓的typosquatting攻击在目标不小心输入错误的名称时成功,例如输入“mplatlib”或“maratlib”而不是合法的和流行的包matplotlib

夏尔马说,他发现了6个安装加密软件的软件包,这些软件会利用受感染计算机的资源挖掘加密货币,并将其存入攻击者的钱包。所有六篇文章都是由使用PyPI用户名的人发布的nedog123在某些情况下,早在4月份就会出现。软件包和下载编号如下:

  • maratlib: 2371
  • maratlib1: 379
  • matplatlib-plus: 913
  • mllearnlib: 305
  • mplatlib: 318
  • learninglib: 626

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

PyPI一直一个经常虐待 存储库2016年,一名大学生欺骗了17000名程序员,让他们运行了他发布在那里的粗略脚本。

并不是说PyPI被滥用得比其他存储库更多——去年,包被下载了数千次RubyGems安装了恶意软件,试图拦截比特币支付。在此之前的两年,有人通过后门入侵了一个托管在NPM的200万用户的代码库。Sonatype已经追踪了超过12000个恶意NPM包自2019年以来。

人们很容易认为,这些事件中有相当数量的下载是自动完成的,从未导致电脑受到感染,但上面链接的大学生实验却不这么认为。他伪造的Python模块在超过17000个独立的域上被执行了超过45000次,其中一些域属于美国政府和军事组织。这种滥交从来都不是一个好主意,但它应该被严格禁止。

76年读者评论

  1. 这是一个很好的提醒,只是因为某人可以检查开放源代码的错误或恶意更改,这并不意味着任何人检查代码。
    945个帖子|注册
  2. 这就是为什么我们不能拥有美好的东西。
    注册了648个帖子
  3. 唉呀——只要在心里复制粘贴我昨天关于勒索软件的评论,这样我就不需要在这里重新输入了,好吗?

    短版本:我们不打算解决这个问题,不是因为我们不知道如何解决(在将第三方代码合并到您的项目之前审核它,托管您自己已知的好版本,升级时重复),而是因为这样做的难度和费用太大,大多数组织无法承受。

    说实话,有多少开发团队有时间、人才和资源去审核他们的第三方代码供应链,特别是当你一直在追逐依赖性的时候?我敢打赌,答案接近于零,以至于没有区别。

    次优——从有信誉的来源获取代码,检查签名,控制版本,只有在有理由的情况下才升级,这是更可行的,但除非有人在某处执行“审核代码”步骤,否则当这种情况发生时,您就会陷入困境。
    3409个帖子|注册
  4. mewmew写道:
    这是一个很好的提醒,只是因为某人可以检查开放源代码的错误或恶意更改,这并不意味着任何人检查代码。


    这些缺陷不是由检查代码的人发现的吗?:)这更像是:时间可能不适合你的时间表。
    注册了1778个帖子
  5. mewmew写道:
    这是一个很好的提醒,只是因为某人可以检查开放源代码的错误或恶意更改,这并不意味着任何人检查代码。


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

    他们的商业模式从未超越销售。
    93个帖子|注册
  6. 这是疯狂的。如今,由于每个项目都存在巨大的传递依赖关系,不可能保证提取的库不掺杂。缺少对每个工件和源的审核和签名。然而,审计链的强度将与最薄弱的环节一样大。
    714个帖子|注册
  7. mewmew写道:
    fknuckles写道:
    mewmew写道:
    这是一个很好的提醒,只是因为某人可以检查开放源代码的错误或恶意更改,这并不意味着任何人检查代码。


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


    对不认识的人随意微笑是令人毛骨悚然的。

    但我的观点是,开源本身并不意味着任何东西都要经过一致的审查,就像人们可以假设封闭源代码是经过审查的一样。这是人们的一个坏习惯,他们想当然地认为,仅仅因为代码可以被检查,就可以神奇地保证开源的安全,并想当然地认为实际上有很多人在做这些跑腿的工作。


    微笑是人类最基本的非语言暗示之一。它通常意味着“我没有敌意”。

    你更广泛的观点很有道理,但你最初的总结忽略了其中的细微差别,我只是想指出这一点。

    我在这里说的是显而易见的,但更有可能的是,开放源码软件受到检查只是因为代码可以提供给更多的人,但检查的频率和严格程度是不确定的,正如您所指出的,您不能因此假设它更安全或更可靠。

    这个问题看起来将变得越来越迫切需要解决。
    注册了1778个帖子
  8. mewmew写道:
    这是一个很好的提醒,只是因为某人可以检查开放源代码的错误或恶意更改,这并不意味着任何人检查代码。


    没错,但是考虑到这里的攻击(针对输入错误的包),更好的问题是您是否检查了正确的开放源码包?
    529个帖子|注册
  9. jhodge写道:
    唉呀——只要在心里复制粘贴我昨天关于勒索软件的评论,这样我就不需要在这里重新输入了,好吗?

    短版本:我们不打算解决这个问题,不是因为我们不知道如何解决(在将第三方代码合并到您的项目之前审核它,托管您自己已知的好版本,升级时重复),而是因为这样做的难度和费用太大,大多数组织无法承受。

    说实话,有多少开发团队有时间、人才和资源去审核他们的第三方代码供应链,特别是当你一直在追逐依赖性的时候?我敢打赌,答案接近于零,以至于没有区别。

    次优——从有信誉的来源获取代码,检查签名,控制版本,只有在有理由的情况下才升级,这是更可行的,但除非有人在某处执行“审核代码”步骤,否则当这种情况发生时,您就会陷入困境。


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

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

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

    短版本:我们不打算解决这个问题,不是因为我们不知道如何解决(在将第三方代码合并到您的项目之前审核它,托管您自己已知的好版本,升级时重复),而是因为这样做的难度和费用太大,大多数组织无法承受。

    说实话,有多少开发团队有时间、人才和资源去审核他们的第三方代码供应链,特别是当你一直在追逐依赖性的时候?我敢打赌,答案接近于零,以至于没有区别。

    次优——从有信誉的来源获取代码,检查签名,控制版本,只有在有理由的情况下才升级,这是更可行的,但除非有人在某处执行“审核代码”步骤,否则当这种情况发生时,您就会陷入困境。


    我希望有更多的标准库。c++、Java和Go都有很好的丰富的语言。这与javascript的精神相违背,但它会有所帮助(我认为)。
    5739个帖子|注册
  11. jhodge写道:
    唉呀——只要在心里复制粘贴我昨天关于勒索软件的评论,这样我就不需要在这里重新输入了,好吗?

    短版本:我们不打算解决这个问题,不是因为我们不知道如何解决(在将第三方代码合并到您的项目之前审核它,托管您自己已知的好版本,升级时重复),而是因为这样做的难度和费用太大,大多数组织无法承受。

    说实话,有多少开发团队有时间、人才和资源去审核他们的第三方代码供应链,特别是当你一直在追逐依赖性的时候?我敢打赌,答案接近于零,以至于没有区别。

    次优——从有信誉的来源获取代码,检查签名,控制版本,只有在有理由的情况下才升级,这是更可行的,但除非有人在某处执行“审核代码”步骤,否则当这种情况发生时,您就会陷入困境。


    完全正确。我参与了将一家初创公司的代码卖给一家《财富》500强公司的交易。大公司iirc雇了一家安全公司对我们使用的每一个图书馆进行审计。因此,我递归地编译了链接到我们代码库中的每个库的列表。结果是我们直接链接了大约100个库,但递归的数量超过了10,000个。作为一家初创公司,我们不可能去看,或者花钱请人去看,所有这些。你必须是一家富有的公司才能做到这一点(感谢买家将其作为最佳实践)。

    但是,每个说“去每个图书馆看看”的人都从未真正尝试过,或者他们在一家资金充足的公司工作。并不是所有人都在这种情况下编写代码。
    3102个帖子|注册
  12. adamsc写道:
    jhodge写道:
    唉呀——只要在心里复制粘贴我昨天关于勒索软件的评论,这样我就不需要在这里重新输入了,好吗?

    短版本:我们不打算解决这个问题,不是因为我们不知道如何解决(在将第三方代码合并到您的项目之前审核它,托管您自己已知的好版本,升级时重复),而是因为这样做的难度和费用太大,大多数组织无法承受。

    说实话,有多少开发团队有时间、人才和资源去审核他们的第三方代码供应链,特别是当你一直在追逐依赖性的时候?我敢打赌,答案接近于零,以至于没有区别。

    次优——从有信誉的来源获取代码,检查签名,控制版本,只有在有理由的情况下才升级,这是更可行的,但除非有人在某处执行“审核代码”步骤,否则当这种情况发生时,您就会陷入困境。


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

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

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



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

    也许是一些经过批准和审查的已知好的库和版本的白名单?这当然是棘手和不愉快的。
    3102个帖子|注册
  13. mewmew写道:

    对不认识的人随意微笑是令人毛骨悚然的。


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

    有些东西在他们的雷达下被忽略的可能性是相当高的,因为他们无法在一个小的版本变化或小的事情之后调查每个食谱,而且大多数食谱都链接到上游(这引入了另一个问题,如。整个巴布亚的崩溃)。

    我猜最终会有一个主动的“杀毒软件”出现,因为包及其源代码周围的复杂工具链。

    编辑:-并不是我喜欢在系统中引入更多漏洞的另一个程序的想法,但正如上面所讨论的,像中毒库这样的载体很难管理,需要一些积极的东西来防御它们。
    85个帖子|注册
  15. 所以…是时候开始严格执行requirements.txt文件的使用了?
    70个帖子|注册
  16. mewmew写道:
    这是一个很好的提醒,只是因为某人可以检查开放源代码的错误或恶意更改,这并不意味着任何人检查代码。

    是的,这是我经常对那些经常宣传某种开源软件而妖魔化另一种开源软件的人的评论。

    没有人会完全检查他们运行的所有代码。没时间了。所以大多数情况下,你会认为是别人的问题——软件通常都有一个“别人的问题”的领域。在封闭源代码中,这是设计上的,因为你假设公司中有人负责检查代码,如果它真的非常糟糕,公司也要(在某种程度上)负责。对于开源,你只需要假设别人已经看过了。问题是,大多数人都是这么想的,所以通常不被关注,除了那些积极参与的人,他们可能是坏演员(参见这个故事来自四月当两名大学研究人员试图故意为一篇论文提交糟糕的代码时)。

    事实证明,一些真正重要的大型代码库并没有让很多人阅读它们的源代码——这种情况持续了多久?(26个月!)

    谁会为此负责呢?没有一个人。因为在许多情况下不容易知道这是故意的还是偶然的,或者在某些情况下谁贡献了代码。没有人负责,除了你自己,这意味着你必须阅读所有的代码,没有人有时间这么做。
    2202个帖子注册|
  17. fknuckles写道:
    mewmew写道:
    这是一个很好的提醒,只是因为某人可以检查开放源代码的错误或恶意更改,这并不意味着任何人检查代码。


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

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

    将某些版本标记为“经过[name]审查的”,其中[name]是有信誉的代码检查人员的名称,他仔细检查了自上次审查以来的所有更改。
    优秀的检查员最终会在这方面建立起声誉,甚至可能是职业生涯。
    注册了1264个帖子
  18. 引用:
    这种滥交从来都不是一个好主意,但它应该被严格禁止。


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

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


    你的意思是,“没人愿意花时间做这件事”。这里的“一个”是你或你的组织,等等。我觉得这是现代软件开发的一大缺陷。每个人都在竞相尽快推出“最小可行产品”。然后在漏洞不断出现的震惊中举手投降。

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

    就这篇文章而言,这些都是由于拼写错误。这似乎只能在人类层面上被治愈,缺乏某种暗示正确回购的智能意识。
    122个帖子|注册
  21. 让我们面对现实吧,这并不奇怪。当然,我可以检查一些我下载的存储库,但我会,答案很可能是不。时间的限制、对代码和语言的熟悉都会大大减慢你的学习速度,并且不能保证你一定能掌握它。

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


    恶意代码被嵌入到文件中setup . py如果要检查代码的功能,很多人要么跳过,要么只是快速浏览一下。差不多有400行设置的东西。什么有趣的。事实上,恶意代码可能只是几行import语句。谁有时间看这些?任何人在进行代码评审时都很难发现它。

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

    仅仅是“开源”,每个人都能看到代码是不够的。不是所有的开发人员都能花时间和精力检查每一行代码。
    2514个帖子|注册
  23. fknuckles写道:
    mewmew写道:
    这是一个很好的提醒,只是因为某人可以检查开放源代码的错误或恶意更改,这并不意味着任何人检查代码。


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

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

    官方存储库的维护者可以禁止来自不受信任的程序员的贡献。不受信任的程序员可能会为另一个风险更高的存储库做贡献。

    如何让程序员获得信任,我留给读者作为练习,但从原则上讲,这似乎很简单,虽然与开源精神相反。

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

    短版本:我们不打算解决这个问题,不是因为我们不知道如何解决(在将第三方代码合并到您的项目之前审核它,托管您自己已知的好版本,升级时重复),而是因为这样做的难度和费用太大,大多数组织无法承受。

    说实话,有多少开发团队有时间、人才和资源去审核他们的第三方代码供应链,特别是当你一直在追逐依赖性的时候?我敢打赌,答案接近于零,以至于没有区别。

    次优——从有信誉的来源获取代码,检查签名,控制版本,只有在有理由的情况下才升级,这是更可行的,但除非有人在某处执行“审核代码”步骤,否则当这种情况发生时,您就会陷入困境。


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

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

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



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

    也许是一些经过批准和审查的已知好的库和版本的白名单?这当然是棘手和不愉快的。


    它肯定不是完美的,但是如果你安装的每个库都有一个清单,说明它是否需要网络或文件系统访问,以及它的范围有多广,那么它会让捍卫者更容易一些,这样你就可以更多地关注那些需要网络或文件系统访问的库,特别是当一个库改变了作为新版本的一部分所请求的访问级别时。即使进程本身需要发出网络请求,也并不一定意味着该进程中使用的所有100个库都需要。如果您可以将事情的范围降到可以用于为系统级沙箱工具或代理生成更微妙的策略的级别(“我需要网络访问,但只需要端口443到*.googleapis.com”或“我需要文件系统访问,但只需要读取x509 CA存储和配置文件”),那就特别有趣了。

    SolarWinds几乎是最难防御的案例,因为它完全被破坏了而且这类软件需要非常广泛的访问级别。我肯定会考虑如何阻止这种情况,但我认为仍然有很多价值的措施,可能不会阻止它,但会让更容易捕捉,同时阻止更容易的事情,如云证书/加密钱包驱动攻击。
    2463个帖子注册
  26. “这种滥交从来都不是好主意,但应该严格禁止。”

    怎么做?有些包的名字有点笨。而且它们都托管在一个“受信任的”存储库站点上。

    我可以在我的客户端上启用什么功能来“禁止”它下载这些损坏的包?他们是无符号吗?(有多少合法的包裹被签名?)说真的-我如何配置我的PC(或Pi),以使这些内容不会意外下拉?

    我是否需要一个苹果控制的库“商店”?: - p

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

    对于NPM,我下载了一个“看起来值得信任”的包。但这稍后可能会添加一个新的依赖项。npm安装婴儿。一些我甚至不知道的东西可能被拉下来(是的,我们经常检查npm审计的结果)。
    514个帖子|注册
  27. Carpetsmoker写道:
    标题图片中的Python代码看起来很古怪。Python 4000看起来很像Java!

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

    免费的公共包管理器是一个好东西,但它们对企业来说是有风险的,就像你从网上下载的任何其他软件一样,需要小心。
    588个帖子注册
  29. Powerlord写道:
    Carpetsmoker写道:
    标题图片中的Python代码看起来很古怪。Python 4000看起来很像Java!

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

    我想知道为什么1不能是质数。不包含1的质数的定义似乎相当武断。

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

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

    如果质数的定义被改成1是质数,那么许多涉及质数的语句就需要以一种更尴尬的方式重新措辞。例如,算术基本定理需要用因数分解的形式重新表述为大于1的质数,因为每个数都有多个因数分解,其中1的拷贝数不同类似地,埃拉托色尼的筛分器如果将1作为质数处理,将不能正确工作,因为它将排除所有1的倍数(也就是说,所有其他数字),只输出单个数字1.[42]质数的其他一些更技术性的性质也不适用于数字1:例如,欧拉totient函数或除数和函数的公式与1是不同的到了20世纪初,数学家们开始一致认为,1不应该被列为质数,而应该作为一个“单位”放在它自己的特殊类别中
    登记的员额有8144个
  30. npm和PyPI当然可以更新他们的客户端,这样当你试图下载一个看起来像另一个流行的包但下载量更少的包时,他们就会发出一个响亮的警告。他们还可能要求新软件包的名称与流行软件包的名称非常不同。
    588个帖子注册
  31. 我一直不理解为什么每个人在从左到右导入依赖项时都不喘不过气来,而且通常不是按特定的版本号,而是按“最新”。

    我们只使用特定的版本号,并在构建系统中自己托管重要的内容。诚然,这并不能阻止糟糕的代码进入供应链,但如果我们总是在一个断开连接的副本上落后一年,我们就不太可能成为零号病人。
    注册了276个帖子
  32. mewmew写道:
    这是一个很好的提醒,只是因为某人可以检查开放源代码的错误或恶意更改,这并不意味着任何人检查代码。


    这听起来像是一个成立开源审计小组的好理由。
    注册了1150个帖子
  33. foobarian写道:
    免费的公共包管理器是一个好东西,但它们对企业来说是有风险的,就像你从网上下载的任何其他软件一样,需要小心。

    人们会认为,当企业开发一个项目时,更高的预算和更长的时间框架也需要仔细检查所有内部和第三方组件。

    但这种假设往往是错误的。
    注册了1264个帖子
  34. perholmes写道:
    我一直不理解为什么每个人在从左到右导入依赖项时都不喘不过气来,而且通常不是按特定的版本号,而是按“最新”。

    我们只使用特定的版本号,并在构建系统中自己托管重要的内容。诚然,这并不能阻止糟糕的代码进入供应链,但如果我们总是在一个断开连接的副本上落后一年,我们就不太可能成为零号病人。


    我正在为“自动下载任何依赖项并按要求运行它”而喘不过气来,而不是“在$ dependency未安装在本地环境上失败”或“在$ dependency未在本地网络repo上失败”。这就是现在的情况,对吧?天啊,这看起来又懒又蠢。

    至少你可以有一个linter,里面有一个导入的白名单,对吧?
    51个帖子|注册
  35. 我认为唯一可以缓解这种情况的方法是,你有一个第三方,它可以获取库,并对代码进行自动和手动扫描,然后你在从第三方下载之前为服务付费。问题是他们只能通过300个最受欢迎的图书馆来处理太多的图书馆。

    甚至我自己也知道,有时我尝试着做一个实验,只是为了看看某些东西是否可行,我需要快速地完成它,我不会花几天的时间来检查代码,仅仅为了30分钟的努力,看看它是否符合我的要求。

    这类问题不会以目前的结构消失。
    447个帖子|注册
  36. adamsc写道:
    jhodge写道:
    唉呀——只要在心里复制粘贴我昨天关于勒索软件的评论,这样我就不需要在这里重新输入了,好吗?

    短版本:我们不打算解决这个问题,不是因为我们不知道如何解决(在将第三方代码合并到您的项目之前审核它,托管您自己已知的好版本,升级时重复),而是因为这样做的难度和费用太大,大多数组织无法承受。

    说实话,有多少开发团队有时间、人才和资源去审核他们的第三方代码供应链,特别是当你一直在追逐依赖性的时候?我敢打赌,答案接近于零,以至于没有区别。

    次优——从有信誉的来源获取代码,检查签名,控制版本,只有在有理由的情况下才升级,这是更可行的,但除非有人在某处执行“审核代码”步骤,否则当这种情况发生时,您就会陷入困境。


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

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

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


    不要忘记那些不引用依赖于另一个库的库,而是打包在自己的库中。
    22954个帖子|注册
  37. 条条大路通到自己依赖的地狱。

    Pypi至少应该有两个独立的存储库:一个仅限于已建立的包,另一个开放,用户可以自行承担安装包的风险。默认模式应该是访问已建立的repo中的代码,安装需要一个特定的标志,以允许来自开放包存储库的依赖项。它并没有解决问题,但至少使这个问题对非营利组织来说更容易管理,并鼓励工业界捐款来帮助保护pypi。
    595个帖子注册
  38. jhodge写道:
    唉呀——只要在心里复制粘贴我昨天关于勒索软件的评论,这样我就不需要在这里重新输入了,好吗?

    短版本:我们不打算解决这个问题,不是因为我们不知道如何解决(在将第三方代码合并到您的项目之前审核它,托管您自己已知的好版本,升级时重复),而是因为这样做的难度和费用太大,大多数组织无法承受。

    说实话,有多少开发团队有时间、人才和资源去审核他们的第三方代码供应链,特别是当你一直在追逐依赖性的时候?我敢打赌,答案接近于零,以至于没有区别。

    次优——从有信誉的来源获取代码,检查签名,控制版本,只有在有理由的情况下才升级,这是更可行的,但除非有人在某处执行“审核代码”步骤,否则当这种情况发生时,您就会陷入困境。



    这听起来像是我们需要一个数字公共卫生部门,有代码检查员,就像现在的公共卫生部门有食品安全,x光设备和其他检查员!
    1894个帖子|注册

你必须置评。

通道Ars Technica