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) - це триетапний обмін:
- Backup - зберегти виведений секрет із максимальною кількістю спроб, дозволених до самознищення.
- Expose - обов’язковий крок підтвердження після успішного Backup.
- Restore - пізніше пред’явити PIN знову, щоб отримати секрет назад (або дізнатися, що він не збігається).
Одна операційна деталь, яку варто знати навіть звичайному користувачеві: реалізація не повинна перезапускати пару Backup+Expose після того, як вона вже один раз успішно пройшла - це скидає лічильник спроб і послаблює саму гарантію захисту від підбору, заради якої він існує.
Що відбувається після забагато неправильних спроб
Тут у побутових поясненнях зазвичай плутають три насправді окремі обмеження - вони незалежні одне від одного, і лише одне з них є незворотним:
| Обмеження | Область дії | Що відбувається | Відновлюване? |
|---|---|---|---|
| Лічильник спроб анклаву SVR2 | Встановлюється при першому Backup PIN (власні застосунки Signal ставлять 10) | Досягнення 0 змушує анклав незворотно стерти збережений секрет - ніхто, включно з Signal, не може це скасувати | Ні |
| Обмеження швидкості перевірки PIN на сервері | 10 спроб на 24 години | Просто обмеження швидкості перевірки токена Registration Lock при реєстрації/зміні номера - скидається щодня | Так, автоматично |
| Вікно заморозки Registration Lock | 7 днів | Починається в момент, коли хтось правильно підтверджує номер телефону (справжній код 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 на іншому пристрої”), який з’явився б і при
справжній самостійній перереєстрації десь-інде. За самим лише
інтерфейсом неможливо визначити, чи це була атака, чи власна дія
власника на іншому пристрої - це знає лише сам сервер.
gendb register/verify ніколи його не встановлюють. Запропонований
інтерфейс після реалізації:
signal2sip-gendb <ім'я> pin set,
signal2sip-gendb <ім'я> pin verify, і
signal2sip-gendb <ім'я> registration-lock enable/disable. Зважаючи
на те, що баг тут може спалити реальні, обмежені за кількістю спроб
здогадки SVR2 на живому акаунті, це отримає додаткову ретельність
тестування перед випуском - більшу, ніж потребувала більшість інших
функцій signal2sip.