ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

AI 写的上传接口,我一眼看出三个漏洞——Trae 边界实录(中):安全与隐式耦合

AI 写的上传接口,我一眼看出三个漏洞——Trae 边界实录(中):安全与隐式耦合 系列第 2 篇。上篇讲业务、版本、架构本篇讲安全与隐式耦合下篇讲协作与一致性。开场最危险的不是“报错”让 Trae 写一个文件上传接口Prompt 是写一个 FastAPI 文件上传接口把文件保存到 uploads 目录。它给出fromfastapiimportFastAPI,UploadFileimportos appFastAPI()app.post(/upload)asyncdefupload(file:UploadFile):contentawaitfile.read()save_pathos.path.join(./uploads,file.filename)withopen(save_path,wb)asf:f.write(content)return{ok:True,path:save_path}跑得通。上传个小图片返回{ok: true}一切正常。这就是最危险的地方——它“能用”所以你会直接上生产。下面三个漏洞全部可复现。漏洞一路径穿越file.filename是客户端可控的。构造一个请求curl-XPOST http://localhost:8000/upload\-Ffiletest.txt;filename../../etc/cron.d/evilos.path.join(./uploads, ../../etc/cron.d/evil)会拼成os.path.join(./uploads,../../etc/cron.d/evil)uploads/../../etc/cron.d/evilos.path.join不会清理..实际写到/etc/cron.d/evil。配合定时任务直接 RCE。漏洞二类型伪造curl-XPOST http://localhost:8000/upload\-Ffileshell.php;filenameshell.php上传一个.php如果 uploads 目录被 Web 服务器当静态目录暴露就是 webshell。Trae 的原始代码完全不看文件类型。漏洞三内存 DoSddif/dev/urandomofbig.binbs1Mcount10240curl-XPOST http://localhost:8000/upload-Ffilebig.binawait file.read()把整个文件读进内存。10GB 文件直接打爆进程服务挂掉——一个极低成本的 DoS。修复版可运行fromfastapiimportFastAPI,UploadFile,HTTPExceptionfrompathlibimportPurePosixPathimportos,uuid appFastAPI()UPLOAD_DIR./uploadsMAX_SIZE10*1024*1024# 10MBALLOWED_EXT{.png,.jpg,.jpeg,.gif,.pdf}os.makedirs(UPLOAD_DIR,exist_okTrue)app.post(/upload)asyncdefupload(file:UploadFile):# 1. 类型校验扩展名白名单extPurePosixPath(file.filenameor).suffix.lower()ifextnotinALLOWED_EXT:raiseHTTPException(400,不支持的文件类型)# 2. 重命名彻底杜绝路径穿越safe_namef{uuid.uuid4().hex}{ext}save_pathos.path.join(UPLOAD_DIR,safe_name)# 3. 分块读取超限中断size0withopen(save_path,wb)asf:whilechunk:awaitfile.read(1024*1024):sizelen(chunk)ifsizeMAX_SIZE:f.close()os.remove(save_path)raiseHTTPException(413,文件过大)f.write(chunk)return{ok:True,path:save_path}修复点对照漏洞修复手段路径穿越不用原始文件名uuid重命名 扩展名单独校验类型伪造扩展名白名单后续可加 MIME / 文件头校验内存 DoS分块读取超限中断并删除残留文件安全追问必须由你发起Trae 默认只回答“怎么实现”不回答“怎么防人”。所以正确的用法是让它先写然后你明确追问——这段代码存在哪些安全问题请逐一列出 1. 输入校验 2. 路径/权限 3. 资源耗尽 4. 注入 每一类都给出攻击方式与修复代码。它会补得不错。但触发这个追问的必须是你不能是它。安全的责任AI 不会主动接。延伸坑跨文件隐式耦合安全之外还有一类更隐蔽的漏洞# 直接调用Trae 能看到utils.format_price(x)# 通过字符串反射调用Trae 看不到handlergetattr(utils,format_price)handler(x)让 Trae 改format_price的签名它会改掉可见的直接调用却漏掉getattr这种字符串引用。上线后反射调用报错。根因Trae 按静态调用关系判断影响面对字符串、反射、事件回调注册、配置里的类名识别不可靠。改进方法改公共 API 前自己 grep 全仓库grep-rnformat_price--include*.py.再确认有没有字符串、反射、配置用法。把 AI 的“影响面分析”当线索不当结论。小结Trae 写的上传接口逻辑“无懈可击”安全“千疮百孔”安全追问必须由你发起改公共 API全仓 grep 不能省—上篇业务、版本、架构见系列上篇。下篇为什么 AI 写的 review 没人信以及怎么让 AI 长期保持一致。收藏 关注系列不丢。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表