### 漏洞概述 - **漏洞编号**: gh-141707 - **漏洞描述**: 在处理GNU长文件名时,TarInfo DIRTYPE规范化被跳过。具体而言,当文件名以`/`结尾时,`AREGTYPE`头会被转换为`DIRTYPE`头,但这一转换在GNU长文件名处理中被跳过。 - **影响**: 这可能导致在处理包含GNU长文件名的tar文件时,目录类型的文件被错误地识别为普通文件。 ### 影响范围 - **受影响模块**: `Lib/tarfile.py` - **受影响函数**: `_frombuf`, `_fromtarfile`, `_proc_pax` - **具体场景**: 当解析包含GNU长文件名的tar文件时,如果文件名以`/`结尾,`AREGTYPE`头不会被正确转换为`DIRTYPE`头。 ### 修复方案 - **修复文件**: `Lib/tarfile.py` - **修复内容**: - 在`_frombuf`函数中,添加了对`dircheck`参数的检查,确保在`dircheck`为`True`时,`AREGTYPE`头会被转换为`DIRTYPE`头。 - 在`_fromtarfile`函数中,同样添加了对`dircheck`参数的检查。 - 在`_proc_pax`函数中,也添加了对`dircheck`参数的检查。 ### POC代码 ```python def test_longname_file_not_directory(self): # Test reading a longname file and ensure it is not handled as a directory # Issue #141707 buf = io.BytesIO() with tarfile.open(mode='w', fileobj=buf, format=self.format) as tar: ti = tarfile.TarInfo() ti.type = tarfile.AREGTYPE ti.name = ('a' * 99) + '/' + ('b' * 3) tar.addfile(ti) buf.seek(0) with tarfile.open(mode='r', fileobj=buf) as tar: actual = {t.name: t.type for t in tar.getmembers()} self.assertEqual(expected, actual) ``` ### 总结 该漏洞涉及在处理GNU长文件名时,`AREGTYPE`头未被正确转换为`DIRTYPE`头,导致目录类型的文件被错误识别。修复方案通过在相关函数中添加对`dircheck`参数的检查,确保在适当情况下进行类型转换。