Python中如何防范Package钓鱼攻击

前几天,我在 PyPI 上投放了 20+ 个 evil package,用于统计随意安装 package 同学的信息。

详细的记录在 http://blog.fatezero.org/2017/06/01/package-fishing/


Python中如何防范Package钓鱼攻击
37 回复

如何防范?


帖子标题问的是Python里怎么防Package钓鱼攻击,这问题挺关键的,尤其是在用pip装包的时候。核心就两点:验证包的来源检查包的内容

最直接的办法就是只用官方源。别乱加来路不明的--index-url。用公司内网的私有源也行,但得确保管理员把好了关。

对于要装的包,上PyPI官网查一下总没错。看看项目主页、维护者、下载量,还有README。如果是个新包或者维护者没名气,就得留个心眼。

更硬核一点,可以用pip--hash选项。在requirements.txt里这么写:

# requirements.txt
requests==2.31.0 \\
    --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1

这样pip安装时会核对哈希值,文件被篡改了就装不上。

自己写脚本自动化检查也是个路子。比如,用pip-audit扫已知漏洞,用bandit查代码安全问题。下面是个简单的检查脚本框架:

import subprocess
import sys

def install_and_audit(package_spec):
    # 1. 安装包
    subprocess.check_call([sys.executable, "-m", "pip", "install", package_spec])

    # 2. 用pip-audit检查漏洞 (需要先安装pip-audit)
    try:
        result = subprocess.run(["pip-audit"], capture_output=True, text=True)
        print("漏洞审计结果:")
        print(result.stdout)
        if result.returncode != 0:
            print("警告:发现漏洞或审计失败", file=sys.stderr)
    except FileNotFoundError:
        print("未安装pip-audit,跳过漏洞扫描")

    # 3. 用bandit检查已安装包的代码 (需要先安装bandit)
    # 这里以检查当前环境site-packages中该包为例,逻辑较复杂,通常直接扫描项目目录
    # 此处仅示意
    print("\n提示:建议使用 'bandit -r /path/to/your/project' 进行代码安全扫描")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("用法: python check_package.py <package_spec>")
        sys.exit(1)
    install_and_audit(sys.argv[1])

总结:核心就是只信可靠来源,安装前做点基本调查。

除非每个新 package 新上 pypi 时大家 review vote (或者专人审核)

原来都是你们这些人把好名字都注册了。

浪费。 (这里就不骂人了,简直污染社区

想起了 Arch Linux AUR 仓库的 vote 和 comment 机制

前几页看到了 baidu \ stanford \ jd 的 ?

不如提供一下完整的数据包?大家爬起来也很费事啊。

npm 应该也有类似的问题吧?

删除会释放名字

好奇有没有人测试过 homebrew cask


apt-get install jq
for i in seq 0 20 10685; do curl -s ‘http://evilpackage.fatezero.org/json?order=asc&offset=’$i |jq -r ‘.rows|map([.ip,.username,.hostname,.language,.package]|join(","))|join("\r\n")’; done

暴露 ip 有点过了。。

希望可以引起官方和用户的重视

之前写了两个库,结果最开始想的名字全都被占了,不过好歹别人先来的也就不说啥了,不过楼主这种做法确定不是恶意扰乱社区?

之前就觉得 PyPI 这种放任上传的方式有点太懒散了,可能会出事. 个人觉得这个锅作者背一半, PyPI 也应该背一半.

那大概就是网络实名制和专人审核制的原因?

光荣榜列出 pypi 的用户名和 ip ?你是会玩的

这些 ip 可以利用起来

让我想起最近知乎上看到的,还有这种操作的帖子
只想说楼主会玩
pypi 已经发生过这样的事了,为什么不补救

防不慎防,尤其是这种陶瓷名字的,很多人真的会不注意

所以骂谁呢?骂热衷发现问题还指出问题所在的人?

我给你讲,宝宝 你会被打的~

brew cask 不是要审核的吗

楼主域名不错

我感到很惊讶, 原来可以不用审核就可以上线啊?

是的,不用任何审核,随便传

楼主会玩儿 666

不错,pip / npm / gem 都可以搞起来

把 ip 都放出来过分了吧。。真正该上榜的是你们这些 evil package

搞事情也是有所为有所不为的
你这样的分分中被社区 dalao 吊打

域名赞

真是个大胆的想 /做法

用户名频率最高的果然是 root

IP 属于 PII, 在公司数据库里都是非常敏感的数据. 建议楼主不要这样公布这些数据.

初略的统计了下 PyPI 上的数据:

import names: 94465
package names: 83129

命名真的是个很蛋碎的事情,楼主这。。

Guido 要回一个名字都要和 pypi 那边扯皮很久,还是那个名字的项目已经很久没维护了

回到顶部