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