1 个不稳定版本
0.0.1 | 2023年6月15日 |
---|
#11 在 #xmp
120KB
475 行
C2PA攻击
概述
此工具用于生成C2PA图像,可用于安全测试。此工具的目标是允许C2PA合作伙伴的安全团队生成图像,以测试其软件的漏洞,例如跨站脚本。此工具将读取攻击字符串文件,将字符串添加到指定的清单字段中,并生成相应的恶意C2PA图像,可以上传到网站或提供给软件进行测试。该工具不会自动检查攻击是否成功。
每个C2PA工具或服务都有自己的独特行为和技术堆栈。因此,此工具是一个用于测试的框架,可以针对特定目标进行定制。预计工具的用户将为其特定环境创建定制的攻击文件。此工具附带文件仅作为初始实验的示例。
请注意:虽然此工具是对开源C2PA c2patool的修改,但它不是该工具的替代品。c2patool包含更多功能,c2patool将是此工具在分析和测试期间的一个伴侣。
此工具包括测试环境的基础。请参阅附录以了解如何将此工具的基线扩展到覆盖更多文件类型、更多注入和其他形式的代码覆盖率。
为什么构建此工具?
C2PA社区应该被赋予权限对其自己的软件进行安全测试,这个工具将有助于在开发周期早期进行测试。从理论上讲,处理任何C2PA图像的第一步是验证签名并拒绝任何不是来自受信任CA的图像。尽管如此,测试解析器仍然很重要,因为一些黑客会找到将意外数据放入C2PA相关字段的方法。此外,可以设想,C2PA的成员可能会编写一个不验证证书而解析C2PA数据的工具。因此,这些工具能够安全地处理意外输入将至关重要。
示例命令行
对于那些想跳过完整阅读此文档的人来说,以下是一些示例工作命令行。每个命令之前的段落解释了工具如何解释命令行。以下示例中引用的文件是本git仓库的一部分。
作为先决条件,该工具假设您有用于签名内容的证书。此存储库包含在样本目录中的证书和签名密钥。在样本目录中关联的test.json清单引用此证书进行此工具的初始测试。因此,以下证书将在下面的命令行中隐式使用。但是,这些证书可能不会被您的目标应用程序识别。您可能需要为您的平台生成自己的证书,这些证书来自经过批准的CA。签名证书的要求在C2PA 规范中概述。一旦您有了自己的证书,您就可以按照本文件附录中所述使用它们。
示例命令 #1:通过命令行注入到作者字段
/c2pa-attacks ./sample/C.jpg -m ./sample/test.json -t author -a ./attacks/xss.attack -o ./sample_out/C_mod2.jpg -f
上述命令行转换为以下步骤
- 从基本图像开始:C.jpg
- 添加由test.json指定的清单
- 通过从文件xss.attack注入字符串来修改清单的作者名称
- 将签名结果输出到sample_out目录,文件名以C_mod2.jpg结尾
- 强制覆盖任何现有文件。
此命令的结果将在sample_out目录中生成恶意文件,文件名为:author_xss_0_C_mod2.jpg、author_xss_1_C_mod2.jpg、author_xss_2_C_mod2.jpg等。文件author_xss_0_C_mod2.jpg将把xss.attack的第一行注入到作者名称中。文件author_xss_1_C_mod2.jpg将把xss.attack的第二行注入到作者名称中。
示例命令 #2 -- 使用正则表达式替换JSON清单中的作者字段进行注入
/c2pa-attacks ./sample/C.jpg -m ./sample/author_name_attack.json -a ./attacks/xss.attack -t regex -o ./sample_out/C_mod2.jpg -f
上述命令行转换为以下步骤
- 从基本图像C.jpg开始
- 从xss.attack读取攻击字符串
- 读取由test.json指定的清单
- 将test.json中出现的字符串"C2PA_ATTACK"替换为该轮的相应攻击字符串。
- 将新的恶意JSON转换为清单
- 将签名结果输出到sample_out目录,文件名以C_mod2.jpg结尾
- 强制覆盖任何现有文件。
此命令的结果将在sample_out目录中生成恶意文件,文件名为:regex_xss_0_C_mod2.jpg、regex_xss_1_C_mod2.jpg、regex_xss_2_C_mod2.jpg等。test.json中所有出现字符串"C2PA_ATTACK"的地方都将被相应的攻击字符串替换。
测试证书颁发机构字段
安全研究人员可以创建基于自签名的CA及其叶证书的自签名CA。C2PA项目在此存储库中提供了使用openssl生成证书的工具:https://github.com/c2pa-org/testing-private/tree/main/cert-generation。
在本项目中,样本目录中有一个证书,其常用字段中存在一些意外的值,可用于签名。这些证书基于自签名CA,因此它们不会被任何验证受信任CA列表的工具接受。然而,它们可以用来确保您的证书解析器可以处理意外的字符。它们不代表一个完整的攻击套件,但它是一个开始的地方。
要使用具有意外字符的证书,在运行测试时使用malicious_certificate.json清单文件。它将使用malicious_certificate.pem文件和malicious_certificate.key文件来签名C2PA图像。为了更全面的测试,您可以使用上面提到的C2PA testing-private仓库来创建您自己的证书链。如果您只需要测试具有不同算法的证书,那么这里有一个基线套件:https://github.com/contentauth/c2pa-rs/tree/main/sdk/tests/fixtures/certs。
完整安装
PREREQUISITE:安装Rust。
输入以下命令来安装或更新工具
cargo install c2pa-attacks
在git目录中本地测试
如果您只想进行本地测试构建,则可以指定make命令,后跟您的对应操作系统平台。请参阅Makefile以了解操作系统平台选项
rm -rf ./target/*
make build-release-{YOUR_OS_PLATFORM}-{YOUR_CPU}
./target/{YOUR_OS_PLATFORM}/release/c2pa-attacks
更新
要确保您有最新版本,请输入此命令
c2pa-attacks -V
该工具将显示已安装的版本。将显示的版本号与仓库发布页面上显示的最新发布版本进行比较。要更新到最新版本,请使用上面显示的安装命令。
检查创建的文件
强烈建议您还安装c2patool。这将允许您检查此工具的输出文件。有关更多信息,请参阅c2patool的文档。
支持的文件格式
该工具与以下类型的资产文件(也称为assets)一起工作。
MIME类型 | 扩展名 | 只读 |
---|---|---|
图像/jpeg |
jpg,jpeg |
|
图像/png |
png |
|
图像/avif |
avif |
X |
图像/heic |
heic |
X |
图像/heif |
heif |
X |
视频/mp4 |
mp4 |
|
应用/mp4 |
mp4 |
|
音频/mp4 |
m4a |
|
视频/quicktime |
mov |
|
应用/x-c2pa-清单-存储 |
c2pa |
NOTE:Quicktime(.mov)格式目前尚不完全支持。
用法
该工具的命令行语法是
c2pa-attacks [OPTIONS] [path]
其中<path>
是将清单嵌入到资产中的路径。
以下表格描述了命令行选项。
CLI选项 | 简短版本 | 参数 | 描述 |
---|---|---|---|
--target |
-t |
<目标> |
指定注入的目标值。见支持的目标值。 |
--attack_file |
-a |
<攻击文件> |
指定包含注入列表的文件。见创建攻击文件。 |
--config |
-c |
<配置> |
指定清单定义作为JSON字符串。见在命令行上提供清单定义。 |
--manifest |
-m |
<清单文件> |
指定要添加到资产文件的清单文件。请参阅将清单添加到资产文件。 |
--parent |
-p |
<parent_file> |
指定父文件的路径。请参阅指定父文件。 |
--output |
-o |
<output_file> |
指定输出文件的路径。请参阅显示清单数据。 |
--detailed |
-d |
N/A | 显示详细的C2PA格式清单数据。请参阅详细清单报告。 |
--force |
-f |
N/A | 强制覆盖输出文件。请参阅强制覆盖。 |
--version |
-V |
N/A | 显示版本信息。 |
--help |
-h |
N/A | 显示CLI帮助信息。 |
支持的目标值
C2PA攻击工具有两种注入恶意字符串的方法。这些选项相互排斥,不能同时使用。目前支持以下值:"title","author","claim_generator","person_identifier","vendor","label","instance_id","format",和"regex"。
这些标志的含义如下
- title: 图片的标题字段。在test.json文件中,这将对应于"My Title"字段。
- author: 创意工作断言中的作者姓名。在test.json文件中,这将对应于名为"Joe Bloggs"的字段。
- person_identifier: 在创意工作断言中,这指的是SchemaDotOrg Person条目的URL标识符。有关更多信息,请参阅:https://c2pa.org/specifications/specifications/1.3/specs/C2PA_Specification.html#_use_of_schema_org
- claim_generator: 清单中的断言生成器字段。在test.json文件中,这将对应于"claim_generator"的"TestApp"值。
- vendor: 设置生成清单标签时使用的供应商前缀。对于某些字符串,您可能会看到错误
claim could not be converted to CBOR
。这仅仅意味着由于不兼容,其中一个攻击字符串无法转换。与CBOR兼容的攻击字符串将工作,并生成图像。 - label: 设置此清单断言的标签。对于某些字符串,您可能会看到错误
claim could not be converted to CBOR
。这仅仅意味着由于不兼容,其中一个攻击字符串无法转换。与CBOR兼容的攻击字符串将工作,并生成图像。 - instance_id: 设置断言的XMP实例ID。
- format: 设置断言成分的格式。
- regex: 这表示提供的清单应搜索"C2PA_ATTACK"字段。这种方法允许在指定应操纵的特定字段方面有更大的灵活性。
方法1:直接替换
最简单的方法是在签名之前直接注入编译好的清单。这种方法仅支持少数几个常用字段,因为可能存在太多的清单字段,无法从命令行提供所有这些字段。这种方法的优势是,它是一种简单的方法,可以开始测试最常用的字段,而无需了解JSON清单。目前可用的选项是标题、作者和断言生成器。随着工具的成熟,将添加更多字段。在此方法中,注入是在将JSON文件导入并转换为内存中的清单结构之后进行的。因此,可以通过此方法注入任何类型的字符。
方法2:正则表达式
如果目标值是 "regex",则这会指示攻击工具在由清单参数指定的文件中搜索字符串 "C2PA_ATTACK"。在构建恶意镜像时,C2PA攻击工具将在将断言嵌入文件之前,将所有出现的字符串 "C2PA_ATTACK" 替换为恶意字符串。尽管如此,出于单元测试的目的,你可能只想在清单文件中有一个 "C2PA_ATTACK" 字符串。这种方法的优点在于,它允许您将恶意字符串注入清单文件中的任何参数,包括自定义参数。
由于工具正在将恶意值注入JSON字符串,因此任何尾随的反斜杠或引号都会自动转义,以确保清单是有效的JSON。此外,serde序列化框架会检查控制字符(0x00 - 0x32),并在检测到时抛出错误。(见:serde_json的转义逻辑)因此,不允许在正则表达式工作流中进行此类字符注入。未来版本将添加一个功能,可以在签名文件之前注入这些字符。
创建攻击文件
C2PA攻击工具需要知道用于注入攻击的值。给定的注入值是否成功将取决于所使用应用程序和技术的类型。因此,开源项目包括一些通用攻击字符串,以便人们可以尝试使用这个工具。然而,预计安全研究人员将创建适合特定情况的自己的攻击文件。例如,如果您针对Web应用程序,则您的攻击字符串可能是跨站脚本注入。如果您针对桌面应用程序,则您的注入字符串可能是一长串 'a' 字符,以触发缓冲区溢出。攻击目录中的 README.md 文件提供了一些关于如何构建和选择适用于您应用程序的强大攻击文件的具体建议。攻击文件是按行读取的纯文本文件。
在命令行上提供清单定义
要使用命令行参数而不是文件提供清单定义,请使用--config
/ -c
选项。
例如,以下命令添加了一个名为 "org.contentauth.test" 的自定义断言。
c2pa-attacks sample/image.json -c '{"assertions": [{"label": "org.contentauth.test", "data": {"my_key": "C2PA_ATTACK"}}]}' -t regex -a xss.attack
将清单添加到资产文件
要将C2PA清单数据添加到文件,请使用--manifest
/ -m
选项,将清单JSON文件作为选项参数,并指定要签名的资产文件路径。将输出文件作为--output
/ -o
选项的参数指定。例如
c2pa-attacks sample/image.jpg -m sample/test.json -o signed_image.jpg -t title -a xss.attack
注意:如果输出文件与源文件相同,则工具将覆盖源文件。
如果您不使用--output
/ -o
选项,则工具将显示生成的清单,但不会将其保存到文件。
重要提示
由于C2PA攻击工具在每次运行时都会生成多个输出文件,因此输出标志中指定的文件名将带有目标类型和注入攻击文件的行号前缀。因此,上面的例子将生成文件:title_0_signed_image.jpg、title_1_signed_image.jpg、title_2_signed_image.jpg等。
指定父文件
父文件表示在当前编辑之前图像的状态。
将父文件作为--parent
/ -p
选项的参数指定;例如
c2pa-attacks sample/image.jpg -m sample/test.json -p sample/c.jpg -o signed_image.jpg -t title -a xss.attack
您也可以在清单定义中指定父文件。
详细的清单报告
要显示一个详细报告,描述资产中包含的C2PA格式的内部清单,请使用-d
选项。此选项仅在指定了-v
时才有效。工具会将详细报告输出到标准输出(stdout)。
强制覆盖
如果输出文件已存在,则工具将返回错误。使用--force
/ -f
选项强制覆盖输出文件。例如
c2pa-attacks sample/image.jpg -m sample/test.json -f -o signed_image.jpg
附录
C2PA参考
"c2patool"是检查此工具创建的文件的不错补充工具:[https://github.com/contentauth/c2patool](https://github.com/contentauth/c2patool)
本文件包含C2PA标准断言的技术规范,包括JSON样本:[https://c2pa.org/specifications/specifications/1.0/specs/C2PA_Specification.html#_c2pa_standard_assertions](https://c2pa.org/specifications/specifications/1.0/specs/C2PA_Specification.html#_c2pa_standard_assertions)
注入字符串参考
OWASP关于跨站脚本攻击的概述,以及如何测试不同形式的跨站脚本攻击的链接:[https://owasp.org/www-community/attacks/xss/](https://owasp.org/www-community/attacks/xss/)
OWASP测试指南中关于SQL注入的部分:[https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/07-Input_Validation_Testing/05-Testing_for_SQL_Injection](https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/07-Input_Validation_Testing/05-Testing_for_SQL_Injection)
PayloadBox GitHub仓库收集了一系列注入字符串:[https://github.com/payloadbox](https://github.com/payloadbox)
额外的基线测试用例文件
如果您想测试更多的文件类型(除了JPEGs),C2PA在此处维护了一份样本文件列表:[https://github.com/c2pa-org/public-testfiles](https://github.com/c2pa-org/public-testfiles)
创建和使用X.509证书
如果您想创建自己的证书颁发机构,那么这里有一些openssl工具可用:[https://github.com/c2pa-org/testing-private/blob/main/cert-generation/genca.sh](https://github.com/c2pa-org/testing-private/blob/main/cert-generation/genca.sh)
您也可以使用预构建的证书在sample文件夹中创建自己的清单进行测试,而不是生成自己的证书。要使用您自己生成的证书,请在以下清单字段中指定证书文件的路径
private_key
sign_cert
如果您使用的是除了默认的es256
之外的签名算法,请在清单定义字段alg
中指定以下值之一
ps256
ps384
ps512
es256
es384
es512
ed25519
指定的算法必须与private_key
和sign_cert
的值兼容。
您可以将密钥和证书链的值放入两个环境变量中:C2PA_PRIVATE_KEY
(用于私钥)和C2PA_SIGN_CERT
(用于公共证书)。例如,要使用私钥文件和证书文件的 内容进行ES256签名
set C2PA_PRIVATE_KEY=$(cat my_es256_private_key)
set C2PA_SIGN_CERT=$(cat my_es256_certs)
private_key
和sign_cert
都必须是PEM格式。 sign_cert
必须包含一个以根CA证书结束的PEM证书链,该证书链以用于签名的终端实体证书开始,中间证书在根CA证书之前。请参阅sample文件夹中的示例证书。
依赖项
~26–42MB
~789K SLoC