mcpField
S
secrets-in-file-metadata

secrets-in-file-metadata

github.com/useosint数据与数据库571.8k 次安装12 周前更新
代码仓库

关于 secrets-in-file-metadata

面向调查工作的文件元数据分析指南,涵盖不同格式的提取、解读、限制与置信度分级,帮助分析人员将标签视为待核实的陈述,而非定论。

主要功能

  1. 01按文件格式进行元数据筛查
  2. 02ExifTool 命令示例
  3. 03分析 GPS、设备与时间戳
  4. 04检查文档和 PDF
  5. 05说明证据局限并进行置信度分级

适用场景

  1. 01检查图像 GPS 是否有助于定位场景
  2. 02比对多个文件中的相机标识
  3. 03检查文档修订记录与作者信息
  4. 04结合其他证据评估元数据陈述

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/useosint/skills --skill secrets-in-file-metadata

安装后在 Claude Code 中输入/secrets-in-file-metadata确认已加载。

附带文件reference/exiftool-cookbook.mdreference/tag-catalogue.md

详细介绍

文件元数据中的秘密

调查中最快找到的线索,往往就在文件里:精确到小数点后六位的 GPS 坐标、能将四张“无关”图片关联到同一台相机机身的相机序列号、真实员工的文档作者,以及包含公司共享盘名称的模板路径。

初学者常犯两个错误。元数据缺失并不可疑——任何经过社交平台处理的内容通常都没有元数据。而元数据存在也不能证明什么:每个标签都只是最后处理该文件的软件写入的一项声明,而且只需一条命令就能编辑。

根据你掌握的内容,先从哪里着手

你掌握的内容使用原因
从社交平台下载的照片不要期待有元数据分发流程会重新编码。使用 find-the-original-image 找到未剥离元数据的上游副本。
来自论坛、CMS 或直接文件链接的照片完整的 exiftool 转储这些来源会原样提供你的字节数据。GPS 信息在这里留存的概率往往比人们预期的更高。
消息附件完整转储,并记录发送方式作为照片发送通常会重新编码;作为文件发送通常不会。
来自同一来源的文件夹使用 exiftool -r -csv 进行排查你要找的是异常值,以及文件间共有的标签。
DOCX/XLSX/PPTX 文件使用 exiftool,然后解压容器修订记录、评论作者、修订标识符,以及嵌入且保留完整 EXIF 的图片,都不会由 exiftool 显示。
PDF 文件使用 exiftool,然后使用结构解析器可查看制作程序字符串、增量修订、嵌入文件,以及带有各自元数据的图片。
新闻稿或通讯社照片专门查看 IPTC 和 XMP 区块新闻编辑部工作流会在其中写入说明、署名、相关人物和地点;即使 EXIF 不存在,这些信息也往往仍会保留。
设备直接拍摄的 RAW 或 HEIC 文件包括 MakerNotes 在内的完整转储这是信息最丰富的情况:序列号、快门次数、镜头数据、亚秒级时间。
视频使用 exiftool 和 ffprobe可查看容器创建时间、编码器字符串、各轨道的元数据,以及嵌入的 GPS 轨迹。

正确使用 exiftool

exiftool -G1 -a -u -g1 file.jpg        # everything, grouped into sections — best for reading
exiftool -G -a -u -s file.jpg          # everything, one line per tag, real tag names
exiftool -time:all -G1 -a -s file.jpg  # every timestamp anywhere in the file
exiftool -gps:all -n file.jpg          # GPS as raw signed decimals, ready to paste into a map

默认设置会丢失证据的原因:

  • -G / -G1 会为每个标签添加其所属组作为前缀([EXIF]、[XMP]、[IPTC]、[MakerNotes]、[File]、[Composite])。不加此前缀,你就无法区分设备写入的标签和 exiftool 计算出的 Composite 值,也无法区分 EXIF 时间戳和文件系统时间戳。-G1 会提供更细致的分组信息。
  • -a 会保留重复标签,而不是只显示最后一个值。不一致之处往往藏在这里:同一时间戳在两个区块中有不同值,说明两个程序产生了分歧,也就意味着文件经过编辑。
  • -u 会显示 exiftool 无法识别名称的标签。厂商区块往往正是关键所在。
  • -n 会关闭美化输出——显示有符号十进制度数,而不是 52 deg 22' 8.40" N。
  • -s 会输出标签名称而不是描述,方便你再次查询这些标签。
  • -ee 会提取嵌入的数据,包括视频流中的 GPS 轨迹。

先批量排查,再对 CSV 排序,查找哪些文件带有 GPS 信息、反复出现的 SerialNumber、不在所声称时间范围内的时间戳,以及 Software 值不同的那个文件:

exiftool -r -csv -filename -createdate -datetimeoriginal -modifydate \
  -make -model -serialnumber -gpslatitude -gpslongitude -software DIR > triage.csv
exiftool -r -if '$gpslatitude' -p '$directory/$filename  $gpsposition' DIR

完整的命令示例:reference/exiftool-cookbook.md。

解读高价值字段

GPS。 位置来自 GPSLatitude/GPSLongitude 及其 Ref 标签;高度来自 GPSAltitude 和 GPSAltitudeRef。容易忽略的字段更重要:GPSImgDirection 是相机镜头所指方向的罗盘方位角;它既能确定摄影者的位置,也能确定拍摄视角——在匹配街景影像时至关重要。GPSDestBearing 是指向拍摄对象的方位角。GPSHPositioningError 是设备自身估算的精度,单位为米,也是你发现结果的可信半径。GPSDateStamp/GPSTimeStamp 使用 UTC,是文件中唯一可信的时钟信息。 设备指纹。 Make 和 Model 给出设备类型。SerialNumber、 BodySerialNumber、InternalSerialNumber 或 CameraSerialNumber 可识别单个 实体机身——这是文件中用于关联分析、价值最高的标签,能将跨账户、 平台和年份的图像关联到同一台相机。LensSerialNumber 对镜头也有同样的 作用,而机身/镜头组合的关联性更强。厂商的快门计数和图像编号标签可让你 排列设备的输出顺序,并估算两帧之间拍摄了多少张照片。OwnerName、 CameraOwnerName 和 Artist 均由用户设置,常常包含真实姓名。

时间戳。 DateTimeOriginal 是快门按下的时间。CreateDate 是这个 数字文件的创建时间——在相机上两者相同,在扫描、导出或重新编码时则不同。 ModifyDate 是文件最后一次写入的时间;若晚于 DateTimeOriginal,就表示 文件经过处理。注意:EXIF 日期时间不含时区。 除非存在 OffsetTime、OffsetTimeOriginal 或 OffsetTimeDigitized,否则它们都是 设备的本地时间;许多设备不会记录这些标签。因此,应与 UTC 时间 GPSDateTime 对照,以推算设备的时区偏移——这本身还能告诉你设备设置的 经度范围。绝不要把 FileModifyDate 当作照片的证据;它属于你正在查看的 文件系统,复制时会发生变化。

缩略图与图像。 粗心的编辑器会更新主图像,却不更新嵌入的预览,因此预览 可能显示裁剪或修饰前的场景。

exiftool -b -ThumbnailImage file.jpg > thumb.jpg
exiftool -b -PreviewImage   file.jpg > preview.jpg
exiftool -ee -b -JpgFromRaw file.cr2 > embedded.jpg

纵横比不同即可证明图像经过裁剪。内容不同则是完整的证据。

编辑链。 Software、ProcessingSoftware、HostComputer 和 XMP 中的 CreatorTool 会标明哪些工具处理过该文件。XMP 媒体管理标签还能提供更多信息: DocumentID、OriginalDocumentID、InstanceID 和 DerivedFrom 可将导出的 衍生文件关联回你从未见过的源文件,也能关联同一源文件的其他衍生文件。

新闻图片中的 IPTC/XMP。 By-line、Credit、Source、Caption-Abstract、 Headline、DateCreated、City、Country-PrimaryLocationName,以及 XMP 中 的图中人物和创建地点结构。对于通讯社图片,这些标签由人完整填写了人物、地点 和时间的信息——内容由编辑撰写,因此应将其视为有来源的说法,而非传感器读数。

文档。 Author 和 LastModifiedBy 是两项姓名信息。Company 和 Manager 来自 Office 安装信息。Template 可能包含完整的 UNC 路径,从而 暴露内部服务器和部门。RevisionNumber 和 TotalEditTime 可显示文档是经过 反复编辑,还是一气呵成、刻意做出正式文档的样子。LastPrinted 可证明曾经 打印过实体副本。然后打开容器,因为 exiftool 不会显示修订记录中的各作者身份:

unzip -o report.docx -d report_x
# docProps/core.xml, docProps/app.xml  — properties
# word/document.xml                    — w:ins / w:del carry w:author and w:date
# word/comments.xml                    — comment authors and initials
# word/settings.xml                    — revision identifiers, a document-lineage fingerprint
# word/media/                          — embedded images, each with its own intact EXIF
# word/_rels/, xl/externalLinks/       — links to internal paths and other documents

实际操作中,嵌入图像最容易被忽略,却是 GPS 信息的重要来源:文档已清除元数据, 但粘贴在第 4 页的照片没有清除。

PDF。 Producer 会标明写入文件的库或驱动程序,是很有力的线索——由文字 处理器生成的“扫描”文档根本不是扫描件。Creator 会标明用于创作的应用程序。 与 EXIF 不同,PDF 日期包含时区偏移。PDF 支持增量更新,因此文件中可能仍保留 内容的早期版本;文件还可能包含附件和保留自身元数据的图像。使用 pdfimages -list 和 pdfdetach -list 枚举内容,并在阅读前用 qpdf --qdf 展开结构。

按格式分类的标签目录:reference/tag-catalogue.md。

容易出错的地方

  • 剥离发生在文件传入时。 机制如下:会重新编码以生成交付版本的托管平台会丢弃 EXIF;直接提供原始字节的托管平台则会保留 EXIF。大型社交平台会重新编码。许多论坛、可自托管的 CMS、对象存储桶、摄影社区网站和邮件附件则不会。CMS 是一个值得注意的中间情况——页面上的缩放图片已剥离元数据,但媒体目录中的原始上传文件仍然完好,因此请尝试访问原始路径。
  • 元数据缺失不能证明任何事情。 不能证明文件经过清理,也不能证明它是假的,更不能证明上传者很谨慎。应写“未发现 EXIF”,绝不要写“EXIF 已移除”,除非你能展示一份原本包含 EXIF 的副本。
  • 元数据存在只能证明有人写入了某个值。 在依赖位置或时间信息之前,先用 geolocate-from-pixels 从视觉上佐证位置,并根据太阳位置核实时间。
  • 时钟很可能不准。 相机时钟会漂移,旅行后可能仍停留在错误的时区,也不会考虑夏令时。未经校准的 EXIF 日期时间可能相差数小时,除非用 GPSDateTime 或画面中可见的有日期事件进行校准。
  • 复合标签是 exiftool 的计算结果,不是文件本身的内容。 GPSPosition、ImageSize 和 LensID 都是派生值。不使用 -G,你就可能把计算得出的值当成设备写入的值来引用。
  • 截图携带的是截屏设备的元数据,而不是照片的元数据。在据此推断之前,先检查 Model 是否指向一部手机。
  • 提取前编辑将无法恢复原状。 旋转、裁剪,甚至用某些编辑器打开文件,都可能重写标签。请先计算哈希并复制文件。
  • 在线元数据查看器意味着要把证据上传给陌生人。 安装 exiftool;它是一个 Perl 发行包,可离线运行。浏览器本地工具胜过服务器端工具;如果材料受保护令或保密协议约束,或涉及正在进行的刑事案件,两者都不可接受。请假设上传的任何内容都会被保留,并可能被编入索引。

置信度评级

  • 已确认 — 元数据声明得到非元数据证据佐证:GPS 信息与对同一画面进行的独立视觉地理定位相符;相机序列号出现在两个互不相关来源的文件中;文档作者与通过 find-anyone 找到的已知员工相符。
  • 较可能 — 来自可信设备的元数据内部一致;文件来自不会剥离元数据的托管平台;EXIF、XMP 和嵌入缩略图中的时间戳一致;且文件传递链中没有编辑器。
  • 未确认 — 只有一个标签,且没有任何信息可供核对。所有未经视觉核实的 GPS 坐标都属于此类。只要明确标注,这样就可以。
  • 相互矛盾 — 时间戳不一致、缩略图显示了不同场景、视觉证据排除了 GPS 所指位置,或来源否认使用过某个编辑工具。矛盾本身就是一项发现,往往比原始标签更有价值。

示例

核验附在保险理赔申请中的 PDF“现场检查报告”,该报告据称于指定日期在现场撰写。

exiftool -G1 -a -u -g1 report.pdf:Producer 表明文件来自文字处理软件导出,而非扫描仪驱动程序。CreationDate 和 ModDate 相差 11 分钟,两者的时区偏移均比现场所在时区快 3 小时。Author 是名字首字母和姓氏。

pdfimages -list 显示其中嵌入了四张照片。将它们提取出来并运行 exiftool——什么也没有。插入时照片被重新编码了。这条路走不通,而且这种情况很常见。

理赔邮件还附带了一份 DOCX。将其解压:docProps/app.xml 中的 TotalEditTime 不到 4 分钟,Template 是一个 UNC 路径,其主机名属于第三方公司,而非被保险人。word/document.xml 中有另一位作者的修订插入内容。word/media/image2.jpeg 仍保留完整的 EXIF 信息——DateTimeOriginal 比声称的检查日期早两个月,存在 GPS 数据,Model 显示为手机,GPSHPositioningError 为 9 米。

作者姓名可能属实,需通过 x-ray-a-company 与该公司核实。照片拍摄日期与报告声称的日期相矛盾。照片位置尚未确认,已交由 geolocate-from-pixels 处理,所述半径为 9 米。

后续调查方向

已获得的信息交给
GPS 坐标、相机方位角where-was-this-taken、geolocate-from-pixels
作者、所有者、艺术家、评论作者find-anyone
公司、模板 UNC 路径、内部共享名称x-ray-a-company、recon-a-domain-passively
能关联多个文件的相机或镜头序列号graph-the-network
暗示文件经过篡改的软件链is-this-photo-real
类似某个用户名的编辑用户名hunt-a-handle
需要未剥离元数据的原始文件find-the-original-image、read-deleted-pages

法律说明

你有权持有的文件,其元数据可以读取。但有两项限制。无论元数据位于何种文件中,姓名、精确位置和设备标识符都属于 GDPR 及类似法规所指的个人数据,因此必须遵守最小化、保留期限和用途限制——只收集目标所需的标签;不要因为操作方便,就保留某人整个照片库的完整转储。此外,可识别个人的精确历史位置数据,是这项技能中最敏感的材料:它可用于尽职调查、欺诈调查和授权调查,也可能成为跟踪骚扰的原始材料。如果提取 GPS 标签的唯一结果只是得知某位私人个体的住处,请停止。参见 ../../ETHICS.md。

评论

支持 Markdown