AI 代码审计怎样检查 ZIP 解压路径?先验证全部成员,再向空目录写入

AI 代码审计工具没有报错,也不能保证生成的解压函数不会写到目标目录之外。先读取全部ZIP成员,拒绝绝对路径、上级路径、链接和过大内容,再在受控空目录写入。

AI 代码审计工具没有报错,也不能保证生成的解压函数不会写到目标目录之外。先读取全部ZIP成员,拒绝绝对路径、上级路径、链接和过大内容,再在受控空目录写入。

审查AI生成解压脚本的开发者。本文使用 Python 3.11 或以上版本的标准库,先验证一组人工构造的小样本。AI 负责提出实现或解释差异,结果由本地检查决定;这里没有把模型回答当成真实运行结果。

AI 代码审计怎样检查 ZIP 解压路径?先验证全部成员,再向空目录写入

拒绝ZIP成员越界路径前,先定规则

本例只接受以正斜线分段的相对常规文件名,禁止反斜线、冒号、空段、点段与上级段。目标是自己新建的临时空目录。

检查成员数量、单文件大小与总展开大小,读取内容后再次核对长度。这里阈值小,适合教学测试,不是通用服务器额度。

先检查并读取所有成员到受限内存,全部通过才开始写。这能避免发现后面的坏路径之前已写前面的好文件;写阶段磁盘失败仍需单独恢复策略。

给 AI 的输入要包含什么

把下面这份输入说明和你的实际样本一起交给可用的 AI 编程助手。示例只含虚构数据;对真实材料先去除账号凭据和个人信息。

实现受控ZIP解压:最多10文件,每个<=1024字节,总<=4096;成员必须普通相对文件,无../绝对路径反斜线冒号或符号链接。全量验证后才写到新空目录。坏ZIP含ok.txt和../escape.txt,目标仍空。

要求模型保留检查条件,并把它认为缺少的业务定义列出来。若回答改变了输入字段、忽略异常分支或直接删除原材料,先要求修正,再运行。提示词的作用是缩小任务范围,验收仍以代码和数据为准。

保存并运行最小验证程序

下方程序把关键规则和验证用例放在同一个可复跑示例中,便于先理解输入如何变成输出,再用它检查 AI 给出的实现。

新建一个空目录,把下面代码保存为 check.py,在该目录打开终端,运行 python -X utf8 check.py。代码自带示例输入,不需要安装第三方库。

import io,zipfile,stat
from pathlib import Path,PurePosixPath
from tempfile import TemporaryDirectory
def unpack(blob,target):
    if list(target.iterdir()): raise ValueError('目标必须为空')
    pending=[];names=set();total=0
    with zipfile.ZipFile(io.BytesIO(blob)) as archive:
        members=archive.infolist()
        if len(members)>10: raise ValueError('成员过多')
        for info in members:
            name=info.filename;parts=name.split('/')
            mode=info.external_attr>>16
            if info.is_dir() or PurePosixPath(name).is_absolute() or '\\' in name or ':' in name or any(p in ('','.', '..') for p in parts): raise ValueError('路径拒绝')
            if stat.S_ISLNK(mode) or name.casefold() in names: raise ValueError('链接或重名拒绝')
            if info.file_size>1024: raise ValueError('文件过大')
            names.add(name.casefold());total+=info.file_size
            if total>4096: raise ValueError('展开量过大')
            data=archive.read(info)
            if len(data)!=info.file_size: raise ValueError('长度不符')
            pending.append((name,data))
    for name,data in pending:
        path=target.joinpath(*name.split('/'));path.parent.mkdir(parents=True,exist_ok=True);path.write_bytes(data)
def make(names):
    buffer=io.BytesIO()
    with zipfile.ZipFile(buffer,'w') as archive:
        for name in names: archive.writestr(name,b'example')
    return buffer.getvalue()
with TemporaryDirectory() as tmp:
    target=Path(tmp)/'output';target.mkdir()
    try: unpack(make(['ok.txt','../escape.txt']),target)
    except ValueError: pass
    else: raise AssertionError('越界路径必须拒绝')
    assert list(target.iterdir())==[] and not (Path(tmp)/'escape.txt').exists()
    unpack(make(['folder/ok.txt']),target)
    assert (target/'folder'/'ok.txt').read_bytes()==b'example'
    print('bad_archive_wrote_nothing',True)
    print('valid_file','folder/ok.txt')

怎样判断结果符合要求

坏ZIP中的ok.txt也没有落盘,escape.txt没有出现在目标外;合法ZIP写入folder/ok.txt并读回字节一致。

下方是这份最小示例在本地执行得到的输出。它验证示例程序与断言的关系,不代表任何 AI 模型一次就能生成同样代码,也不构成性能或生产可靠性结论。

bad_archive_wrote_nothing True
valid_file folder/ok.txt

本例目标目录由程序独占创建,没有并发进程替换路径。生产系统还需隔离目录、禁链接和权限控制。

全量预读占内存,阈值必须与实际容量一致;大型档案需要专门流式隔离方案。

哪些失败必须停下来处理

加密档案、坏CRC、异常压缩方式会在读取时失败,不应返回成功。

Windows保留设备名等平台限制未完整实现,真实服务应使用平台文件名白名单,不能当作通用安全解压器。

接入自己的任务前再核对一次

让AI逐项指出路径、规模、预校验与写入失败处理,再运行恶意成员测试。

规则检查与功能读回一起保留;扫描器没有发现问题不能替代输入契约审计。

资料与适用范围

ZIP成员名可能包含越界路径;读取与解压外部档案前应检查路径及资源范围。以下链接核对于 2026-10-03;运行环境及额外依赖按本文前述说明。

相关基础可阅读 AI 生成的 Python 代码安全吗?用 Bandit 定位危险调用。本文的重点是拒绝ZIP成员越界路径,可以把两项检查作为不同步骤保留。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/33511.html

赞 (0)
AI小管家的头像AI小管家
让 AI 排序版本号为什么 v10 排在 v2 前?定义数字段规则,并拒绝混合格式
上一篇 44分钟前
AI全能助手怎么用
下一篇 2026年9月21日 上午12:47

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部