Що робити, якщо JWT викрадений?


203

Я намагаюся реалізувати автентифікацію без громадянства з JWT для моїх RESTful API.

AFAIK, JWT - це в основному зашифрована рядок, передана як заголовки HTTP під час виклику REST.

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

Власне, ця проблема стосується всіх аутентифікації на основі лексем .

Як цього запобігти? Безпечний канал на зразок HTTPS?


1
Ось чому жетони часто дійсні лише короткий проміжок часу. І так, ви повинні використовувати HTTPS, якщо вас турбує конфіденційність ваших даних.
Джонатан Райнхарт

4
@JonathonReinhart Але якщо маркер скоро закінчиться, мій клієнт повинен буде отримати новий маркер, час від часу повторно підтверджуючи себе. Хіба це не нудно?
smwikipedia

@JonathonReinhart Я думаю, що я зрозумів, чому маркер недовговічний. Оскільки таким чином, серверу не потрібно стежити за закінченням терміну дії маркера і таким чином створювати можливість для масштабованості. Це свого роду trade-offміж having finer control of token expirationі having better scalability.
smwikipedia

2
Чи може це також допомогти? - "Загальний механізм захисту для виявлення крадіжок токенів - це відстеження походження IP-адреси запиту." - докладно описано в останньому розділі тут - firebase.google.com/docs/auth/admin/manage-sesions
Ула,

3
Теоретично неможливо запобігти крадіжці жетонів. Найкраще, що ми можемо зробити, це виявити, що це сталося, а потім скасувати сеанс якнайшвидше. Найкращим методом виявлення є використання обертових токенів оновлення (як це запропоновано RFC 6819). Ось блог, який детально пояснює це: supertokens.io/blog/…
Rishabh

Відповіді:


287

Я автор бібліотеки вузлів, яка обробляє автентифікацію досить глибоко, експрес-штурмом , тому я задзвонюся тут деякою інформацією.

По-перше, JWT зазвичай не шифруються. Хоча існує спосіб шифрування JWT (див.: JWE ), це не дуже часто на практиці з багатьох причин.

Далі будь-яка форма автентифікації (з використанням JWTs чи ні) піддається атакам MitM (атаки людини в середині). Ці напади трапляються, коли зловмисник може ДІЯТЬ СВОЙ МЕРЕЖІЙ трафік під час здійснення запитів через Інтернет. Це те, що може бачити ваш Інтернет-провайдер, АНБ тощо.

Це те, що SSL допомагає запобігти: шифруючи трафік мережі з комп'ютера -> деякий сервер під час автентифікації, третя сторона, яка контролює ваш мережевий трафік, НЕ може бачити ваші маркери, паролі чи щось подібне, якщо вони якось не в змозі отримати копію приватного ключа SSL сервера (навряд чи). З цієї причини SSL ОБОВ'ЯЗКОВО для всіх форм аутентифікації.

Припустимо, однак, що хто - то зможе використовувати свій SSL і можуть переглядати ваш маркер: відповідь на ваше запитання в тому , що ТАК , зловмисник буде мати можливість використовувати цей маркер , щоб видавати себе за вас і прошу зробити на свій сервер.

Ось тут і надходять протоколи.

JWT - це лише один стандарт для маркера аутентифікації. Їх можна використовувати майже все. Причина JWT є якоюсь класною в тому, що ви можете вбудовувати в них додаткову інформацію, і ви можете перевірити, що ніхто з цим не заплутався (підписання).

ЗАРАЗ, самі JWT не мають нічого спільного з "безпекою". Для всіх намірів і цілей JWT - це майже те ж саме, що і ключі API: просто випадкові рядки, які ви використовуєте для десь аутентифікації на якомусь сервері.

Що робить ваше питання цікавішим, це те, що використовується протокол (швидше за все, OAuth2).

Як працює OAuth2, це те, що він був розроблений для надання клієнтам ТЕМПОРАРІЙНИХ жетонів (як JWT!) Для аутентифікації ТОЛЬКО КОРОТКОГО ПЕРІОДУ ЧАСУ!

Ідея полягає в тому, що якщо ваш маркер буде викрадений, зловмисник може використовувати його лише короткий проміжок часу.

За допомогою OAuth2 вам доведеться повторно аутентифікувати себе на сервері так часто, надаючи своє ім’я користувача / пароль АБО API даних і потім отримуючи токен в обмін.

Оскільки цей процес трапляється раз у раз, ваші жетони будуть часто змінюватися, що ускладнює зловмисникам постійно себе представляти, не зазнаючи великих проблем.

Сподіваємось, це допомагає ^^


3
Автор наступної статті стверджує, що недоліком JWT є те, що єдиний спосіб відновити з викраденого JWT - це генерувати нову пару ключів та ефективно виходити з системи всіх користувачів. Тоді як із ідентифікаторами сеансу, що зберігаються в БД, веб-сайт може видалити лише сеанси постраждалого користувача та вийти з нього з усіх пристроїв. Я не впевнений, як OAuth2 вписується на малюнок тут чи допомагає пом'якшити представлені недоліки. medium.com/@rahulgolwalkar/…
Марсель

5
Автор невірний. Існують різні шаблони дизайну, які можна використовувати для визнання недійсними маркерів. Але взагалі: використання JWT для будь-яких цілей аутентифікації - погана ідея. Набагато ефективніше використовувати cookie-сеанс із вбудованою всередині криптографічно підписаною ідеєю сеансу.
rdegges

1
@rdegges скажіть, будь ласка, як JWT є поганою ідеєю для аутентифікації? і як я можу використовувати файли cookie сесії, які ви згадали у вашому коментарі вище?
номанський туфай

6
Це занадто довго, щоб набрати одну відповідь. Якщо ви хочете дізнатися більше, я детально поговорив на цю тему. Ви можете ознайомитись з моїми слайдами в Інтернеті: speakerdeck.com/rdegges/jwts-suck-and-are-stupid
rdegges

2
Теоретично неможливо запобігти крадіжці жетонів. Найкраще, що ми можемо зробити, це виявити, що це сталося, а потім скасувати сеанс якнайшвидше. Найкращим методом виявлення є використання обертових токенів оновлення (як це запропоновано RFC 6819). Ось блог, який детально пояснює це:supertokens.io/blog/…
Rishabh

31

Я знаю, що це давнє запитання, але я думаю, що я можу скинути тут $ 0,50, ймовірно, хтось може покращити або надати аргумент, щоб повністю відмовитись від мого підходу. Я використовую JWTs у API RESTful через HTTPS (ofc).

Щоб це працювало, завжди слід видавати недовговічні жетони (це залежить від більшості випадків. У моєму додатку я фактично встановлюю expпретензію на 30 хвилин і ttlна 3 дні, тому ви можете оновити цей маркер до тих пір, поки його ttlвсе ще є дійсний, а маркер не потрапив у чорний список )

Для того authentication service, щоб визнати недійсними лексеми, я хотів би використовувати кеш-пам'ять у пам'яті ( в моєму випадку переробляється ) як JWT blacklist/ ban-listвперед, залежно від деяких критеріїв: (Я знаю, що це порушує філософію RESTful, але збережені документи є насправді недовговічні, оскільки я чорний список за час, що залишився - ttlстверджувати-)

Примітка: жетони в чорному списку не можуть бути оновлені автоматично

  • Якщо user.passwordабо user.emailоновлено (вимагає підтвердження пароля), служба аутентифікації повертає оновлений маркер і визнає недійсним (чорний список) попередній (и) список, тому якщо ваш клієнт виявить, що особистість користувача якось порушена, ви можете попросити цього користувача змінити свій пароль . Якщо ви не хочете використовувати для цього чорний список, ви можете (але я не рекомендую вам) підтвердити iat(видану на) претензію проти user.updated_atполя (якщо jwt.iat < user.updated_atтоді JWT недійсний).
  • Користувач свідомо вийшов із системи.

Нарешті, ви перевіряєте маркер нормально, як і всі.

Примітка 2: замість того, щоб використовувати сам маркер (який дійсно довгий) як ключ кешу, я пропоную генерувати та використовувати маркер UUID для jtiпретензії. Що добре, і я думаю (не впевнений, оскільки це щойно прийшло в голову), ви можете використовувати цей самий UUID, як і маркер CSRF, повернувши secure/non-http-only cookie та належним чином реалізуючи X-XSRF-TOKENзаголовок за допомогою js. Таким чином ви уникаєте обчислювальної роботи, створюючи ще один маркер для перевірок CSRF.


9
Ніколи не пізно внести свою ідею. Спасибі за Вашу відповідь.
smwikipedia

2
Якщо ви зберігаєте чорний список на сервері, який потрібно перевірити для кожного запиту, чому б просто не використовувати звичайний старий сеанс?
Франклін Ю

@FranklinYu Чорний список набагато дешевший, ніж повний сесійний магазин. Оскільки ви зберігаєте недовговічні об’єкти ключових значень (залежно від їхнього часу, що залишився, який має бути досить коротким), і це відбувається лише для дій виходу та таких дій, які недійсні маркерів, тому не кожен маркер є зберігається оф.
Фрондор

2
Як дешево це може бути? Перш за все, якщо ви все ще зберігаєте що-небудь на стороні сервера, ви не користуєтесь перевагою "масштабованості", заявленим JWT, оскільки все ще існує центральний сервер чорного списку, з яким потрібно поговорити з усім сервером додатків, перш ніж робити що-небудь. Якщо вам потрібно зберігати лише 1 к чорний список через швидкий термін дії, ви можете зробити те ж саме для сеансів, тому потрібно зберігати лише 1 к сеанси.
Франклін Ю

3
Мені подобається такий підхід. Насправді не потрібно перевіряти чорний список кожного запиту, лише за запитом, який відбувається після закінчення терміну дії JWT (який ви можете прочитати з самого маркера) і до періоду TTL після. У "стандартному" випадку використання це має статися, щонайбільше, один раз у житті певного маркера. Після оновлення ви, ймовірно, можете відхилити будь-які майбутні запити на оновлення. Дякуємо @Frondor
Джон Акерман

7

Вибачте, що трохи запізнювались на цьому, але мали подібні проблеми і тепер хочу щось зробити на цьому.

1) червоні пропозиції додав чудовий момент, що JWT не має нічого спільного з "безпекою" і просто перевіряє, якщо хтось заплутався з корисним навантаженням чи ні (підписання); ssl допомагає запобігти порушенням.

2) Тепер, якщо ssl також якимось чином порушений, будь-який підслуховувач може викрасти наш маркер носія (JWT) і видати себе справжньому користувачеві, наступним кроком, що можна зробити, є шукати "доказ володіння" JWT у клієнта .

3) Тепер, при такому підході, ведучий JWT має певний ключ Proof-of-володіння (POP), який одержувач може криптографічно підтвердити, чи є запит від того самого справжнього користувача чи ні.

Я згадав про це статтю « Доказ володіння» і переконаний у цьому.

Я буду в захваті, якщо зможу внести свій внесок у що-небудь.

Ура (y)


0

Чи не можемо ми просто додати ip початкового хоста, який попросив генерувати цей маркер JWT як частину претензії? Тепер, коли JWT вкрадено та використовується з іншої машини, коли сервер перевіряє цей маркер, ми можемо перевірити, чи відповідає запитувана ip машина з одним набором у складі претензії. Це не відповідає, а значить, маркер можна відхилити. Також якщо користувач намагається маніпулювати маркером, встановивши власний ip на маркер, то маркер буде відхилено, оскільки маркер буде змінено.


Це одне можливе рішення, але для клієнтів, що стоять за брандмауером, його типове для IP-адреси потрібно вибирати з пулу адрес, яке може змінюватися в будь-який час.
SpeedOfSpin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.