Перейти до вмісту
PIN Signal і Registration Lock

PIN Signal і Registration Lock

PIN у Signal захищає акаунт від конкретного сценарію захоплення: коли хтось інший отримує контроль над самим номером телефону (оператор переоформлює покинутий номер, SIM-swap шахрайство, фізична крадіжка SIM-картки). Без PIN єдине підтвердження власності при реєстрації в Signal - це “може отримати код підтвердження”, тож будь-хто, хто володіє номером, може перереєструватися з ним і відключити всі пристрої справжнього власника. З увімкненим PIN і Registration Lock сервер відмовляється завершувати таку перереєстрацію без нього, навіть маючи дійсний код підтвердження.

⚠️
Жоден акаунт, створений через signal2sip-gendb register сьогодні, не має PIN взагалі - реєстрація свідомо пропускає цей крок (еквівалент натискання “Пропустити” на екрані створення PIN у реальному клієнті), тож жоден із цих акаунтів наразі не отримує цього захисту. Див. блок про заплановану роботу внизу сторінки.

Як це працює під капотом

Сам PIN ніколи не покидає ваш пристрій у відновлюваній формі. Він використовується для виведення секрету, який зберігається в SVR2 (Secure Value Recovery, v2) - сервісі на базі SGX-атестованого анклаву, здатному підтвердити збіг здогадки, при цьому оператор (сам Signal чи хтось інший) ніколи не може прочитати збережене значення напряму. Протокол на рівні даних (svr2.proto, вбудований у libsignal) - це триетапний обмін:

  1. Backup - зберегти виведений секрет із максимальною кількістю спроб, дозволених до самознищення.
  2. Expose - обов’язковий крок підтвердження після успішного Backup.
  3. Restore - пізніше пред’явити PIN знову, щоб отримати секрет назад (або дізнатися, що він не збігається).

Одна операційна деталь, яку варто знати навіть звичайному користувачеві: реалізація не повинна перезапускати пару Backup+Expose після того, як вона вже один раз успішно пройшла - це скидає лічильник спроб і послаблює саму гарантію захисту від підбору, заради якої він існує.

Що відбувається після забагато неправильних спроб

Тут у побутових поясненнях зазвичай плутають три насправді окремі обмеження - вони незалежні одне від одного, і лише одне з них є незворотним:

ОбмеженняОбласть діїЩо відбуваєтьсяВідновлюване?
Лічильник спроб анклаву SVR2Встановлюється при першому Backup PIN (власні застосунки Signal ставлять 10)Досягнення 0 змушує анклав незворотно стерти збережений секрет - ніхто, включно з Signal, не може це скасуватиНі
Обмеження швидкості перевірки PIN на сервері10 спроб на 24 годиниПросто обмеження швидкості перевірки токена Registration Lock при реєстрації/зміні номера - скидається щодняТак, автоматично
Вікно заморозки Registration Lock7 днівПочинається в момент, коли хтось правильно підтверджує номер телефону (справжній код SMS/дзвінка), але надає неправильний або відсутній PIN - акаунт заморожується, всі пристрої відключаються, доки це не мине або не буде надано правильний PINТак, через 7 днів

Практичний висновок: втрата PIN не залишає сам номер телефону заблокованим назавжди. Навіть у найгіршому випадку - секрет SVR2 втрачено остаточно - заморозка на рівні акаунту обмежена в часі. Через 7 днів без успішного збігу сервер перестає вимагати PIN і дозволяє реєстрацію. Що втрачається назавжди - це те, що було захищено самим секретом SVR2 - для Registration Lock конкретно це лише сам замок, а не історія повідомлень (вона там не зберігається).

Що насправді відчуває легітимний власник

Спокуса думати, що Registration Lock означає “сесія справжнього власника не зачіпається, поки атакуючий застрягає”. Це не зовсім так, і про цей компроміс варто сказати прямо: коли хтось правильно підтверджує номер телефону (справжній код SMS/дзвінка), але не проходить перевірку PIN, сервер заморожує всі пристрої на існуючому акаунті - включно з телефоном справжнього власника, який нічого поганого не зробив. Його застосунок перестає надсилати й отримувати повідомлення, доки він не відреагує.

Цінність тут не в тому, що власника захищено від збою - а в тому, чого позбавлений атакуючий проти наскільки дешево відновлюється власник:

Без Registration LockЗ Registration Lock
Атакуючий, що заволодів номеромМиттєве повне захоплення - видаються нові ключі ідентичності, всі справжні пристрої відключаються назавждиЗастряг - самого номера телефону більше не досить для завершення реєстрації, лишається тільки чекати вікно заморозки без жодних власних локальних даних акаунту
Справжній власникВтрачає акаунт повністю, без варіантівКороткий, самообслуговуваний збій - той самий пристрій, та сама локальна історія повідомлень, розблокування введенням PIN, який він і так знає

Шлях відновлення справжнього власника свідомо дешевий: це перереєстрація на тому самому пристрої (екран повторного введення PIN у Signal-Android буквально називається “Enter the PIN you created for your account”) - без перевстановлення, без втрати даних. І оскільки застосунок явно перестає працювати, а не мовчки ламається, це заразом слугує форсуючим фактором помітити, що щось сталося, у межах 7-денного вікна - навіть попри те, що в інтерфейсі ніде явно не написано “хтось намагався захопити ваш акаунт” - див. нижче про формулювання сповіщення.

Чи повідомляють власнику, що хтось намагався

Явно - ні. Сервер справді надсилає пуш (ATTEMPT_LOGIN_NOTIFICATION_HIGH_PRIORITY) на всі пристрої при невдалій спробі, але його вміст не містить жодного розрізняльного тексту - і Android, і iOS обробляють його ідентично звичайному пушу про вхідне повідомлення. Реальний сигнал - непрямий: цей пуш будить застосунок, той намагається перепідключитися з обліковими даними, які сервер щойно заморозив, отримує відмову і показує той самий загальний банер “деактивовано” (“це, ймовірно, тому, що ви зареєстрували свій номер телефону в Signal на іншому пристрої”), який з’явився б і при справжній самостійній перереєстрації десь-інде. За самим лише інтерфейсом неможливо визначити, чи це була атака, чи власна дія власника на іншому пристрої - це знає лише сам сервер.

🚧
Заплановано, ще не реалізовано. signal2sip дослідив повний протокол і виклики libsignal-ffi, необхідні для цього (той самий паттерн атестованого анклаву, що вже використовується для Contact Discovery), але підтримки PIN/Registration Lock ще немає - gendb register/verify ніколи його не встановлюють. Запропонований інтерфейс після реалізації: signal2sip-gendb <ім'я> pin set, signal2sip-gendb <ім'я> pin verify, і signal2sip-gendb <ім'я> registration-lock enable/disable. Зважаючи на те, що баг тут може спалити реальні, обмежені за кількістю спроб здогадки SVR2 на живому акаунті, це отримає додаткову ретельність тестування перед випуском - більшу, ніж потребувала більшість інших функцій signal2sip.