目前Iam使用apache pdfbox创建数字和电子签名。最近我开始了解数字和电子签名中的漏洞,如通用签名伪造(USF),增量保存攻击(ISA)和签名包装(SWA)。 PDFBox是自动接受这种关注还是我们需要在代码中另外强制执行此操作
首先,提到的攻击是在2019年2月公开发表的硕士论文(由波士顿鲁尔大学的Karsten Meyer zu Selhausen撰写的"Security of PDF Signatures")中发展出来的。派生的"Vulnerability Report"的预发布已经与2018年11月,信息安全相关组织的数量已经确定,因此在文件中测试的一些PDF签名验证器已被修复,以正确显示签名有效性违规或限制。你可以找到关于the PDF insecurity site的概述。
阅读论文并检查示例,我得到的印象是作者及其顾问还没有处理PDF很长时间,至少没有深入处理。导致这种印象的两个例子:
尽管如此,这些攻击很有意思,特别是它们让我想知道哪些攻击者可能会对那些对PDF有更深入了解的攻击者设计攻击......
OP正在“使用apache pdfbox创建数字和电子签名”,并且就上述攻击而言,奇怪的是他作为签名创建者可以做些什么来防止攻击。
实际上签名创建者几乎无法阻止攻击,它主要是签名验证器识别操作的工作。
但是,在某种程度上,他可以提供帮助:签名包装攻击的某些变体使用签名内容中00字节的尾随字符串区域;所以他可以通过尽可能地缩短字符串来帮助防止一些攻击。遗憾的是,有许多签名设置,其中很难预测要嵌入的签名容器的大小,因此难以避免一定数量的尾随00字节。
此外,您可以使用“不允许更改”来制作签名认证签名 - 以这种方式尊重认证级别的验证者可以更轻松地识别并报告任何不允许的更改。但是,如果在长期验证扩展的上下文中使用,这可能是一个障碍。
首先,PDFBox不提供可立即使用的实用程序,用于检查增量更新中所做的更改类型。因此,除非您自己实现,否则您的验证器只能说明覆盖整个文档的签名,即签署文件显示的内容。对于先前的签名,它可以仅表示相应的签名签署了该文档的某些早期版本,而不是该修订版是否与当前版本对应。
在其报告中,基于PDFBox的验证器(没有用于修订比较的大量贡献)不包括整个文档的签名必须指出这一事实并要求用户手动确定修订之间的更改。
针对来自PDF安全站点(ShowSignature
)的示例攻击文件运行PDFBox签名验证示例here,可获得以下结果:
NoSuchAlgorithmException
。NullPointerException
。ClassCastException
。CMSException
。(SecurityThesisValidation测试的结果)
因此,只要基于PDFBox的验证器在适用的情况下正确输出“签名不覆盖整个文档”警告并在任意异常情况下输出“失败”或“未知”,它就不会成为当前攻击文件的牺牲品。
正如@Tilman在对该问题的评论中所说,在加载PDF进行验证时停用宽松模式可能是个好主意。在任何验证程序被愚弄之前,这将抓住大多数ISA和一些USF攻击......
但要注意:如上所述,论文和示例文件显示出一些不足之处。因此,PDFBox很可能容易受到攻击的改进版本的影响。特别是签名包装方法看起来很有希望,因为PDFBox仅使用Contents字符串,并不将其与字节范围间隙的内容进行比较。