После очередного запуска компьютера я начал открывать привычные программы. Они одна за другой не запускались, а при проверке оказывалось, что их exe‑файлы просто исчезли.

Сначала я решил, что сломалась Windows или умирает диск. Но проблема выглядела странно: папки оставались на месте, а файлы внутри них пропадали. В папке C:\custom, где у меня лежали программы, проекты и другие данные, почти ничего не осталось.

Всего там находилось около 800 ГБ.

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

След привел к Telegram Desktop.

Как я нашёл виновника

Telegram был установлен в C:\custom\program\Telegram Desktop, поэтому сначала я подумал на ошибку обновления. Возможно, мессенджер пытался удалить свои старые файлы и заодно задевал всё, что лежало рядом.

Чтобы это проверить, я переустановил Telegram в другое место:

C:\telegram\Telegram Desktop\Telegram.exe

Папку загрузок также указал за пределами C:\custom. Затем создал тестовый файл:

C:\custom\Текстовый документ.txt

После запуска Telegram файл исчез. Я создал его заново, перезапустил мессенджер — файл снова исчез.

Получалось, что Telegram, установленный в C:\telegram, зачем‑то продолжал чистить совершенно постороннюю папку C:\custom

Проверка разных версий показала, когда появился баг. В Telegram Desktop 6.9.4 всё работало нормально, а после обновления до 7.1.1 файлы снова удалялись.

Что показал Process Monitor

Для следующего запуска я включил Process Monitor и запретил удаление тестового файла через права Windows. Telegram дошел до самого удаления, получил отказ, а в логе остался весь процесс.

Событие

Процесс и поток

Действие

672 340

Telegram.exe, PID 696, TID 5688

Открытие C:\custom

672 355

тот же PID и TID

Чтение списка файлов и папок

тот же поток

Обход вложенных папок

1 506 350

тот же PID и TID

Запрос прав Read Attributes, Delete

1 506 360

тот же PID и TID

Запрос права Delete

Между открытием C:\custom и попыткой удалить тестовый файл прошло около 7 секунд.

Стеки вызовов вели внутрь Telegram.exe. Это был не малварь и не какой‑то случайный процесс. Сам Telegram обходил все вложенные папки и удалял всё, до чего мог добраться.

С этими логами я создал issue #31170 и приложил выборку событий и стеков.

Разработчик подтвердил ошибку. Оказалось, что C:\custom удаляла проверка орфографии.

Почему именно custom

Telegram хранит добавленные пользователем слова в файле с именем custom. За эту часть отвечает библиотека lib_spellcheck

 После этого изменения внутреннее хранилище слов стало использоваться и вместе со встроенной проверкой орфографии Windows
После этого изменения внутреннее хранилище слов стало использоваться и вместе со встроенной проверкой орфографии Windows

В версии 7.1.0 изменили работу пользовательских слов со встроенной в Windows проверкой орфографии. После коммита 4929c892 код для Windows тоже начал обращаться к внутреннему файлу со словами.

Но путь к этому файлу задавался после return, который завершал функцию раньше времени.

Если сильно упростить старый код, получалось следующее:

if (IsSystemSpellchecker()) {
    return;
}

SetWorkingDirPath(DictionariesPath());

На Windows условие выполнялось, функция завершалась, а путь к словарю оставался пустым.

Дальше библиотека строила путь к пользовательскому словарю:

customWordsFile = WorkingDirPath() + "/custom";

Вместо внутреннего файла Telegram получалась строка /custom. Qt преобразовал её в папку custom в корне текущего диска — в моём случае в C:\custom

Код ожидал, что custom будет файлом. Если вместо файла там находилась папка, код считал это ошибкой и удалял её:

if (QFileInfo(path).isDir()) {
    QDir(path).removeRecursively();
}

В нормальной ситуации удалялась бы небольшая служебная папка внутри Telegram. Из‑за пустого пути код добрался до моей папки.

QDir::removeRecursively() продолжает работу, даже если часть файлов удалить не удалось. Поэтому занятые DLL оставались на месте, а остальные файлы исчезали.

Ошибка сложилась в простую цепочку:

  1. Windows‑код обратился к внутреннему словарю.

  2. Путь к словарю не был задан.

  3. Пустой путь превратился в /custom

  4. Qt превратил его в C:\custom

  5. Telegram запустил рекурсивное удаление.

Отдельная ирония в том, что коммит 40441b29, участвовавший в этой цепочке, сам исправлял другую ошибку с удалением каталогов словарей.

Как исправили ошибку

Исправление оказалось небольшим. В коммите 9c316281 путь стали задавать до return:

SetWorkingDirPath(DictionariesPath());

if (IsSystemSpellchecker()) {
    return;
}

В самой библиотеке коммитом ac399e5c добавили проверку: если путь пустой, работать со словарём нельзя.

Баг попал в релизы 7.1.0 и 7.1.1. Исправление вошло в 7.1.2. Версии с ошибкой были доступны около 66 часов.

Баг подтвердили на Windows со встроенной проверкой орфографии. На Linux и macOS именно такую цепочку действий не находили.

Что в итоге

Это была не сложная атака и не поломка диска. Telegram получил пустую строку, добавил к ней /custom и рекурсивно удалил всё, что смог.

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

Перед таким удалением программа должна проверить хотя бы две вещи: путь не пустой и он действительно ведёт внутрь папки приложения.

Популярность продукта и количество его пользователей от простых ошибок не защищают. Иногда между «починили пользовательский словарь» и «удалили 800 ГБ данных» находится всего несколько строк кода.

Комментарии (84)


  1. 0hrenet
    28.08.2026 11:54

    Главное что не навайбкодили. /s


    1. InsiderCrush
      28.08.2026 11:54

      Коля Дуров уже не тот :D


      1. Lev3250
        28.08.2026 11:54

        Дуров, верни C:\custom!


  1. peacemakerv
    28.08.2026 11:54

    Еще одно доказательство, что взаимосвязь старого кода с новым кодом рано или поздно преподнесёт внезапный сюрприз. В любом проекте.


  1. funca
    28.08.2026 11:54

    На Linux и macOS именно такую цепочку действий не находили.

    Просто в следующий раз пусть называют свои ресурсы не custom, а bin, boot, home, var, etc - красивые же имена.


    1. RepppINTim
      28.08.2026 11:54

      В линуксе эта поделка тупо отхватила бы Permission Denied при попытке снести рутовые папки без судо

      Хотя если запускать телегу из-под рута, то премия Дарвина найдет своего героя


      1. Daimos
        28.08.2026 11:54

        Папка /custom, созданая юзером, получила бы права юзера и телега спокойно бы её снесла на Линуксе.


        1. becefi
          28.08.2026 11:54

          +


        1. up40k
          28.08.2026 11:54

          Кто ж юзеру даст писать директории в корень, у которого права 755.


      1. LavaLava
        28.08.2026 11:54

        О, внезапно давно из под неадмина в винде работаю, может и задался бы вопросом чего там такоге тг захотел, что запрос прав выдал


        1. tenzink
          28.08.2026 11:54

          Так автора бы это не спасло. Скорее всего пользователь был владельцем каталога custom, и никакие запросы прав не требовались


    1. zorin-expert
      28.08.2026 11:54

      А вдруг так и сделают? Какую-нибудь папку да пропустят


  1. CitizenOfDreams
    28.08.2026 11:54

    Код ожидал, что custom будет файлом. Если вместо файла там находилась папка, код считал это ошибкой и удалял её

    Интересно, перед обращением ко всем остальным файлам Телеграм тоже проверяет отцовство папочность?

    Может быть, автор кода уже допускал подобный косяк, когда вместо файла custom создавалась папка, и добавил проверку специально для этого случая? Это объясняет и небрежность, с которой папка удаляется: "а, все понятно, это у меня где-то в коде ошибка, лень искать где именно, удалим папку на фиг и продолжим работу".


    1. RepppINTim
      28.08.2026 11:54

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


  1. sergopl
    28.08.2026 11:54

    "Telegram удалил 800 ГБ моих данных" - вопрос в том, что Telegram вроде как мессенджер. Почему у Вас 800 ГБ данных хранится в мессенджере?


    1. Newbilius
      28.08.2026 11:54

      Статью не читаем, да...)


  1. CitizenOfDreams
    28.08.2026 11:54

    Почему у Вас 800 ГБ данных хранится в мессенджере?

    А тред мы читаем...

    Скрытый текст


    1. TIEugene
      28.08.2026 11:54

      Вы зря на человека.
      Разворачиваю: зачем человек запустил на машине с 800GB личных данных какой-то мессенжер? Без контроля. И без бэкапов.
      Розум е? Е! Е!

      Demo: тут намедни в интернетах появилось "О! в новой телеге веб-прокси! Качайте телегу 7.1.1!"
      Так вот в свежей федоре 44 (релиз) новой телеги не появилось. Сидим на 7.0.6. Пока новую не проверят на вшивость.


      1. Nicetas
        28.08.2026 11:54

        Ещё один) Где-то написано, что бекапов не было? Розум е?


      1. acsent1
        28.08.2026 11:54

        А что под мессенджер нужен отдельный комп? Под браузер тоже отдельный, под ворд?


        1. cijic
          28.08.2026 11:54

          Ну под vim уж точно :)


        1. mixsture
          28.08.2026 11:54

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

          Идея изоляции выглядит довольно здравой. Например что-то наподобие AppArmor, bubblewrap. Под виндовс, жаль, ничего такого нет.


        1. ts347
          28.08.2026 11:54

          под мессенджер нужен отдельный комп

          Максофоны уже среди нас.


  1. TIEugene
    28.08.2026 11:54

    Только сейчас дошло.
    > 800GB личных данных
    > C:\custom\

    И не палево ни разу.

    PS. где "Материалы для диплома.lnk" на Рабочем столе? Куда мир котиццо?


  1. pairofglocks
    28.08.2026 11:54

    Натыкался на эту же проблему в феврале/марте 2026. Привело все так же к тг. При этом, среди симптом, был странный нюанс — любой .exe запускался по нескольку минут, чистая переустановка тг помогла.


    1. CitizenOfDreams
      28.08.2026 11:54

      Натыкался на эту же проблему в феврале/марте 2026.

      У вас тоже была папка C:\custom? Просто странное имя для папки в корне системного диска, или может быть это какая-то неизвестная мне традиция?


      1. ConfirmationBias
        28.08.2026 11:54

        У вас тоже была папка C:\custom?

        У меня тоже. Была. Теперь она пустовата. Нормальное имя, если для хозяина оно значащее. У меня там привычные твики интерфейса лежат, обои-иконки, шрифты-звуки. Баловство конечно, но всё же не ждёшь таких свиней от софта с полумиллиардной пользовательской базой. Автору огромное спасибо за то, что докопался до дна этой ямы и добился фикса.


  1. tenzink
    28.08.2026 11:54

    Каждое решение по отдельности выглядело нормально:

    Мне и по отдельности шаги показались безумием. Странная логика поиска, отсутствие проверок, рекурсивное удаление - это прямо треш


    1. becefi
      28.08.2026 11:54

      Это уже к QТ вопрос...


  1. AndronNSK
    28.08.2026 11:54

    У меня есть детская травма. В 2000м, предположительно, году я тихонько играл в The Thief предположительно 2, а хдд был 4Гб.

    Поиграв вдоволь (пройдя три уровня, больше не смог, деть же), я решил этот шедевр удалить (игра реально офигенная, если вам в 2000м заметно больше 13 лет).

    Запустил деинсталлчтор и увидел... Что удалено все в папке уровнем выше (все другие игры), а не в папке Вора......

    Штош. Так судьба познакомила с дисками 200 в одном.