12 min read privacy-guides

Утечка метаданных в файлах резюме (PDF/DOCX) и методы деидентификации

Как файлы резюме раскрывают ваше реальное имя, ОС, GPS-координаты, структуру компании и внутренние GUID. Полное руководство по очистке метаданных перед отправкой.

Утечка метаданных в файлах резюме (PDF/DOCX) и методы деидентификации
D

Dim

Security engineer & job-search privacy writer

Когда вы откликаетесь на вакансию, ваше резюме проходит долгий путь: через ATS (Applicant Tracking Systems), почтовые ящики рекрутеров, внутренние чаты Slack или Telegram и, наконец, оказывается на дисках нанимающих менеджеров. Большинство кандидатов тщательно выверяют каждое слово в тексте CV, но полностью забывают о скрытом слое данных — метаданных.

Файлы форматов PDF и DOCX, созданные в популярных редакторах (Microsoft Word, Google Документы, Adobe Acrobat, macOS Pages), содержат обширный массив скрытой служебной информации. Для исследователя безопасности или потенциального злоумышленника эти метаданные являются золотой жилой. Они могут раскрыть ваше настоящее имя, используемую операционную систему, версию офисного пакета, историю изменений документа (включая удаленный конфиденциальный текст), точное время работы и даже геолокацию.

В этой статье мы подробно разберем внутреннюю структуру метаданных документов, покажем, как извлечь эту информацию, и предоставим готовые инструменты для автоматической деидентификации файлов резюме.


1. Анатомия метаданных: PDF против DOCX

Способ хранения метаданных зависит от формата файла. Рассмотрим два наиболее популярных формата резюме.

PDF (Portable Document Format)

В формате PDF метаданные обычно хранятся в двух местах:

  1. Словарь информации о документе (Document Information Dictionary / Info Dict): Традиционный способ, содержащий стандартные поля, такие как Title, Author, Subject, Keywords, Creator (инструмент создания), Producer (инструмент конвертации в PDF) и даты создания/модификации.
  2. Потоки метаданных XMP (Extensible Metadata Platform): Разработанный Adobe стандарт на базе XML. Он дублирует Info Dict, но может содержать гораздо более детализированную информацию, включая историю изменений (редакции), уникальные идентификаторы документов (DocumentID, InstanceID) и даже настройки цветового профиля.

Посмотрим на пример структуры XMP-потока внутри PDF:

<x:xmpmeta xmlns:x="adobe:ns:meta/">
 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <rdf:Description rdf:about=""
    xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
    xmlns:xmp="http://ns.adobe.com/xap/1.0/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
   <pdf:Producer>Mac OS X 10.15.7 Quartz PDFContext</pdf:Producer>
   <xmp:CreatorTool>Pages</xmp:CreatorTool>
   <xmp:CreateDate>2026-05-12T14:23:11+03:00</xmp:CreateDate>
   <xmp:ModifyDate>2026-07-21T10:15:30+03:00</xmp:ModifyDate>
   <dc:creator>
    <rdf:Seq>
     <rdf:li>Dmitriy S.</rdf:li>
    </rdf:Seq>
   </dc:creator>
  </rdf:Description>
 </rdf:RDF>
</x:xmpmeta>

DOCX (Office Open XML)

Формат DOCX представляет собой обычный ZIP-архив, содержащий набор XML-файлов и ресурсов. Если распаковать DOCX-файл, метаданные обнаружатся в следующих файлах внутри папки docProps:

  • core.xml: Содержит базовые свойства (автор, дата создания, дата изменения, количество ревизий).
  • app.xml: Содержит свойства приложения (название текстового редактора, версия, общее время редактирования, количество страниц, слов и скрытых элементов).
  • custom.xml: Кастомные свойства, которые могут быть внедрены корпоративными шаблонами.

Пример содержимого docProps/core.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" 
                   xmlns:dc="http://purl.org/dc/elements/1.1/" 
                   xmlns:dcterms="http://purl.org/dc/terms/" 
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <dc:creator>Иванов Иван Иванович</dc:creator>
  <cp:lastModifiedBy>Администратор домена</cp:lastModifiedBy>
  <cp:revision>14</cp:revision>
  <dcterms:created xsi:type="dcterms:W3CDTF">2026-04-10T12:00:00Z</dcterms:created>
  <dcterms:modified xsi:type="dcterms:W3CDTF">2026-07-20T18:45:00Z</dcterms:modified>
</cp:coreProperties>

2. Какую угрозу несет утечка метаданных?

Утечка метаданных кажется незначительной проблемой лишь на первый взгляд. На практике она создает серьезные риски:

  1. Деанонимизация при конфиденциальном поиске: Если вы ищете работу тайно (находясь в процессе увольнения из текущей компании), метаданные вашего резюме могут содержать ваше реальное имя, логин в корпоративной сети или название вашей текущей организации, даже если вы убрали их из видимого текста резюме.
  2. Раскрытие инфраструктуры и стека: Поле Producer или CreatorTool показывает, какое программное обеспечение вы используете (например, конкретную старую версию MS Word, уязвимую к CVE). Это облегчает злоумышленникам проведение таргетированных фишинговых атак (Spear Phishing).
  3. Восстановление удаленной информации: В некоторых случаях PDF-файлы хранят инкрементальные изменения. Если вы просто удалили из резюме старые места работы или контакты и сохранили файл, эти данные могут физически остаться в предыдущих версиях (Incremental Updates) внутри PDF-контейнера.
  4. Нарушение приватности геолокации: Если в ваше резюме вставлена фотография прямо с телефона, и при конвертации в PDF изображение не было сжато и очищено, EXIF-данные картинки могут содержать точные GPS-координаты места съемки (например, вашей квартиры).

3. Анализ метаданных своими руками: Использование ExifTool

Самым мощным консольным инструментом для чтения и записи метаданных является ExifTool Фила Харви.

Чтобы проанализировать ваше резюме, выполните следующую команду в терминале:

exiftool -a -u -g1 cv_draft.pdf

Флаги означают:

  • -a: показывать дублирующиеся теги;
  • -u: показывать неизвестные теги;
  • -g1: группировать вывод по семействам метаданных.

Пример типичного вывода для небезопасного резюме:

---- System ----
File Name                       : cv_draft.pdf
Directory                       : .
File Size                       : 124 KiB
---- File ----
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
---- PDF ----
PDF Version                     : 1.6
Linearized                      : No
Page Count                      : 2
Title                           : CV_Senior_SRE_2026
Creator                         : Microsoft® Word for Office 365
Producer                        : macOS Version 14.5 (Build 23F79) Quartz PDFContext
Create Date                     : 2026:05:12 14:23:11+03:00
Modify Date                     : 2026:07-21 10:15:30+03:00
Author                          : Dmitriy Second

Обратите внимание: мы четко видим имя автора (Dmitriy Second), операционную систему (macOS Version 14.5), среду создания документа (Microsoft® Word for Office 365) и точные таймстампы работы над файлом.


4. Скрипт автоматической очистки метаданных на Python

Для автоматизации процесса очистки в нашей платформе мы используем специализированные библиотеки. Ниже представлен готовый Python-скрипт, который полностью удаляет все метаданные из PDF-файла, перезаписывает XMP-потоки и сбрасывает даты создания на эпоху Unix (1970-01-01).

Для работы скрипта понадобятся библиотеки pypdf и pikepdf. Установите их:

pip install pypdf pikepdf

Скрипт sanitize_cv.py:

#!/usr/bin/env python3
import sys
import os
import pikepdf
from pypdf import PdfReader, PdfWriter

def sanitize_pdf_pypdf(input_path, output_path):
    """
    Базовая очистка структуры PDF и удаление словаря метаданных.
    """
    reader = PdfReader(input_path)
    writer = PdfWriter()

    for page in reader.pages:
        writer.add_page(page)

    # Записываем пустой словарь метаданных
    writer.add_metadata({})
    
    with open(output_path, "wb") as f:
        writer.write(f)

def deep_sanitize_pikepdf(input_path, output_path):
    """
    Глубокая очистка с использованием pikepdf:
    удаление XMP-потоков, альтернативных представлений и перезапись объектов.
    """
    with pikepdf.open(input_path) as pdf:
        # Удаляем встроенные метаданные (XMP)
        try:
            del pdf.Root.Metadata
        except AttributeError:
            pass
        
        # Очищаем классический Info Dictionary
        try:
            info = pdf.docinfo
            for key in list(info.keys()):
                del info[key]
        except AttributeError:
            pass
            
        # Добавляем стандартные анонимные значения для предотвращения ошибок парсеров
        pdf.docinfo['/Producer'] = 'LibrePDF (Anonymous Engine)'
        pdf.docinfo['/Creator'] = 'Anonymous Document Generator'
        pdf.docinfo['/CreationDate'] = 'D:19700101000000Z'
        pdf.docinfo['/ModDate'] = 'D:19700101000000Z'

        # Сохраняем с полной оптимизацией объектов
        pdf.save(output_path, linearize=True)

def main():
    if len(sys.argv) < 3:
        print("Использование: python sanitize_cv.py <input.pdf> <output.pdf>")
        sys.exit(1)
        
    input_file = sys.argv[1]
    output_file = sys.argv[2]
    
    if not os.path.exists(input_file):
        print(f"Ошибка: Файл {input_file} не найден.")
        sys.exit(1)
        
    temp_file = "temp_clean.pdf"
    try:
        print("[*] Шаг 1: Базовая очистка контейнера...")
        sanitize_pdf_pypdf(input_file, temp_file)
        
        print("[*] Шаг 2: Глубокая очистка XMP и оптимизация объектов...")
        deep_sanitize_pikepdf(temp_file, output_file)
        
        if os.path.exists(temp_file):
            os.remove(temp_file)
            
        print("[+] Очистка успешно завершена! Файл сохранен в:", output_file)
    except Exception as e:
        print(f"[-] Произошла ошибка во время очистки: {e}")
        if os.path.exists(temp_file):
            os.remove(temp_file)
        sys.exit(1)

if __name__ == "__main__":
    main()

Как это работает:

  1. pypdf разбирает документ по страницам и пересобирает его в новый чистый контейнер. Это физически отсекает любые инкрементальные обновления и историю редактирования, которая могла быть скрыта в оригинальном PDF.
  2. pikepdf (построенный на базе мощной C++ библиотеки QPDF) напрямую работает с деревом объектов PDF. Он полностью удаляет XML-схему Root.Metadata, очищает словарь /Info и заменяет чувствительные поля на анонимные значения с датой создания 1970-01-01 00:00:00 UTC.

5. Альтернативный метод: Использование системных утилит в Linux

Если вы работаете в Linux/macOS и предпочитаете использовать консольные инструменты без Python, воспользуйтесь системной утилитой PDFtk или тем же ExifTool:

Очистка метаданных через ExifTool:

exiftool -all= -overwrite_original cv.pdf

Внимание: эта команда удаляет все стандартные теги, но в зависимости от версии PDF XMP-данные могут быть удалены не полностью.

Для гарантированного результата лучше принудительно перезаписать XMP:

exiftool -all= -tagsFromFile @ -all:all -unsafe -XMP:All= cv.pdf

6. Резюме: Чек-лист безопасности перед откликом

Чтобы гарантировать, что ваше резюме не раскроет лишних данных о вас, соблюдайте следующие правила при подготовке финального файла:

  1. Не используйте прямое сохранение из Word/Pages без проверки. Всегда прогоняйте итоговый PDF через скрипт очистки.
  2. Сжимайте и очищайте изображения. Если вы вставляете свое фото в резюме, предварительно очистите его EXIF-данные (особенно гео-теги).
  3. Проверяйте итоговый файл с помощью exiftool. Это должно стать обязательным шагом перед отправкой CV рекрутеру.
  4. Используйте нейтральные имена файлов. Имя файла вроде Dmitriy_S_Resume_SRE.pdf гораздо безопаснее и профессиональнее, чем CV_SRE_draft_v12_edit_Dima_macbook_final.pdf.

Информационная гигиена начинается с малого. Защитите свои персональные данные до того, как они попадут в чужие базы данных.

Read more job search privacy & security guides on the AuditForce blog.