dimhold.by
← Статьи

Сканер секретов нашёл 2 секрета в заметках и ни одного в расшифровке Whisper того же разговора

С тех пор как в сентябре вышел Whisper, я прогоняю через него записи своих звонков. Расшифровки копятся в папке рядом с заметками. Очевидным местом для них был репозиторий git со сканером секретов в хуке на коммит, так же как защищают код. Потом я понял, что понятия не имею, что сканер видит в расшифровке: я запускал его только на коде.

Поэтому я это померил, но без своих настоящих звонков. Тащить настоящие разговоры в тест про их утечку мне не хотелось.

Как я мерил

Я написал короткий разговор двух выдуманных людей, 12 реплик. В него я заложил 11 вещей, которые не должны выйти из комнаты: ключ доступа AWS, прочитанный по буквам, пароль от базы на стейджинге, код от двери офиса, код, который только что прислал банк, телефон, email, номер карты, IBAN, адрес, больную спину коллеги и зарплату, о которой просили молчать. Имён в нём два, Anna и Marek.

Каждая реплика есть в двух вариантах. Первый такой, как я набрал бы её в заметках во время звонка, например DB_PASSWORD=PurpleOtter1987. Второй такой, как её произнесли бы: “the staging database password is still purple otter nineteen eighty seven”. Устный вариант я озвучил espeak-ng 1.51 двумя наборами голосов. Первый это обычные голоса espeak, второй MBROLA us1 и us2, на мой слух они звучат менее механически. Расшифровывал Whisper из репозитория в состоянии на 9 декабря, модели base и small на CPU, fp32, язык задан английский. Получилось 4 расшифровки одного разговора. Каждую реплику я синтезировал и расшифровывал отдельно, поэтому строка N расшифровки это всегда реплика N.

Для секретов я прогнал по каждому документу актуальные в этом году версии: gitleaks 8.15.2, trufflehog 3.21.0 и detect-secrets 1.4.0. Для личных данных я запускал Microsoft Presidio 2.2.31 с моделью spaCy en_core_web_lg. Повторный прогон Whisper дал те же 2 расшифровки MBROLA буква в букву. В расшифровках espeak поменялись 3 строки, потому что там Whisper переходил на сэмплирование: эти 3 строки декодируются при температуре 0,4 и выше. Ни одна ячейка таблицы ниже от этого не изменилась.

Заметки

Здесь инструменты сделали примерно то, чего я ждал. gitleaks нашёл ключ AWS по форме: AKIA и ещё 16 знаков. Пароль он нашёл, потому что тот стоит после PASSWORD= и его энтропия 3,51 едва перешагивает порог правила, 3,5. Так что чуть менее случайный пароль прошёл бы. detect-secrets нашёл только ключ. trufflehog не нашёл ничего. Его детектору AWS нужен идентификатор ключа вместе с секретом, а секрет на 40 знаков в заметках к звонку бывает редко. Presidio нашёл телефон, email, карту, IBAN, город и оба имени. Ещё он решил, что DE89 3704 0044 это человек.

Итого 7 из 11 пунктов поймал хотя бы один инструмент. Код от двери, код от банка, спину и зарплату не поймал никто. Ни у одного из этих 4 инструментов нет правила для четырёхзначного числа, которое кто-то назвал. Я не очень понимаю, как такое правило выглядело бы.

Расшифровки

На 4 расшифровках 3 сканера секретов вместе выдали 0 находок.

Почему так, видно по строкам. Whisper small на голосах MBROLA записал ключ как a KQX7 or HM2 PLT-4WZ6NB. AKIA больше нет, так что регулярке не за что зацепиться. Пароль стал “purple under 1987”, после слова password нет =, поэтому общее правило не срабатывает. Карта стала for 1111 1111 1111 1111 1111: первое “four” превратилось в предлог и появилась пятая группа. Presidio проверяет номера карт алгоритмом Луна. Оставшиеся цифры проверку не проходят. Email стал “hurrymail is in the dot calzcatexample.com”. Marek стал “Merck” на голосах MBROLA и “America’s” на espeak. Presidio принял America за географическое название. Anna уцелела один раз, внутри сломанной строки с email: espeak с small записал “Anna.Kaul’s cat example.com”. Только в этой расшифровке Presidio её и нашёл. В остальных она превратилась в “and”, “in a” или пропала совсем. В расшифровке MBROLA small Presidio вместо неё нашёл человека по имени “hurrymail”.

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

заметки набраны espeak base espeak small MBROLA base MBROLA small секреты ключ AWS пароль базы код от двери код от банка личное телефон email карта IBAN адрес спина коллеги зарплата значение читается инструмент заметил
Whisper сохраняет короткие числа и простые слова и ломает то, у чего есть форма. Адрес считается замеченным, когда Presidio нашёл город.

Whisper сломал большую часть того, что инструменты умеют искать, потому что у таких данных есть форма: префикс, контрольная сумма, @. Телефон тоже уцелел, но только на голосах MBROLA. Во всех расшифровках уцелели код от двери, код от банка, спина и зарплата, то есть ровно то, чего ни один инструмент не поймал ни в одном документе. Это короткие числа и простые слова. Whisper сохраняет числа и смысл, даже когда коверкает слова вокруг. В 1 расшифровке строка про дверь стала “The office norco is 4815”. В расшифровках MBROLA читаемыми остались 5 из 11 пунктов. Presidio отметил 1 из этих 5, телефон, с оценкой 0,4. Ещё он отметил Springfield из адреса, который превратился в “14 ohms street”.

сказано Whisper small, MBROLA что нужно инструменту A K I A Q X 7 R H M ... a KQX7 or HM2 PLT-4WZ6NB AKIA и ещё 16 знаков не совпало four one one one, ... for 1111 1111 1111 1111 1111 16 цифр, проверка Луна не совпало four eight one five 4815 правила нет читается, не замечен
Те же 3 реплики, голоса MBROLA, Whisper small. Инструменты ищут форму, а речь её не сохраняет.

Искажённые пункты по-прежнему читаются любым, кто знает команду: “Merck is up until Friday. The doctor says it is his back again.”

Что возвращает git rm

Вторая половина решения давно известна. Я проверил, как ведёт себя git rm, в основном затем, чтобы иметь право сказать, что проверил. Я закоммитил расшифровку, следующим коммитом удалил её через git rm и посмотрел. git log -S'door' находит оба коммита. Файл читается через HEAD~1 после git gc --prune=now. Свежий клон его тоже содержит, потому что коммит, который его добавил, по-прежнему в истории. Чтобы убрать файл, надо переписать историю через git filter-repo или BFG и надеяться, что никто не успел склонировать. Страница GitHub про удаление конфиденциальных данных советует те же 2 инструмента и предупреждает о существующих клонах.

Так что расшифровки не попадают ни в один репозиторий. Папка лежит вне любых репозиториев. Сканер в хуке на коммит остаётся инструментом для кода.

Чего я не проверял

Это 1 выдуманный разговор с синтетическими голосами. В настоящих звонках есть шум и акценты. Люди перебивают друг друга. С живым голосом Whisper, скорее всего, легче распознаёт имена. Я не пробовал модели medium и large-v2, которые могут восстановить ключ AWS или email. Я не пробовал русский. Presidio работал со стандартными распознавателями. Собственный шаблон для кодов от двери поймал бы часть из них, но, скорее всего, поймал бы и любое четырёхзначное число в разговоре. И я не пробовал языковую модель в роли детектора. Она, возможно, поняла бы “she asked us not to tell the team”, но для этого ей пришлось бы прочитать расшифровку целиком.