Как сохранить в тайне пользователя OAuth и как реагировать на его взлом? - PullRequest
75 голосов
/ 12 декабря 2010

Этот вопрос касается попыток понять риски безопасности, связанные с реализацией oauth на мобильной платформе, такой как Android. Предполагается, что у нас есть приложение для Android, в которое встроен код / ​​секретный ключ пользователя.

Если предположить, что секрет потребителя был взломан, и хакер овладел им, каковы последствия этого?

Предположения о секретности для потребителя
Правильно ли я утверждаю, что скомпрометированный секрет потребителя как таковой не влияет на безопасность пользователя или любые данные, хранящиеся у поставщика с поддержкой OAuth, с которым взаимодействовал пользователь. Сами данные не подвергаются риску и не могут быть извлечены хакером.

Хакеру потребуется получить действительный токен доступа пользователя, а получить его намного сложнее.

Что может сделать хакер с взломанным секретом потребителя?
Правильно ли я также заявляю следующее:

  • Хакер может настроить / опубликовать приложение, которое имитирует мое приложение.
  • Хакер может привлечь пользователей, которые зайдут через поток OAuth, извлекая токен доступа через хакерский OAuth танцевать (используя скомпрометированный потребитель ключ / секретный).
  • Пользователь может подумать он имеет дело с моим приложением, так как он будет увидеть знакомое имя (потребительский ключ) в процессе авторизации.
  • Когда потребитель отправляет запрос через хакер, хакер может легко перехватить токен доступа и в сочетании с потребительской тайной может теперь подписывать запросы от моего имени получить доступ к моим ресурсам.

Влияние на конечного пользователя
В предположении, что

  • хакер настроил приложение / сайт, использующий мой потребительский секрет
  • один из моих пользователей был обманут в авторизации доступ к этому приложению / сайту

Может произойти следующее:

  • конечный пользователь может заметить, что происходит что-то подозрительное, и сообщить поставщику услуг (например, Google) о вредоносном приложении
  • поставщик услуг может затем отозвать потребительский ключ / секрет

OAuth-потребитель (мое приложение) влияние:
Моё приложение (содержащее секретный ключ пользователя) необходимо будет обновить, так как в противном случае все мои клиенты больше не смогут авторизовать мое приложение для запросов от их имени (поскольку мой потребительский секрет больше не будет действителен).

Делегирование всего трафика OAuth
Хотя было бы возможно делегировать много взаимодействий OAuth через промежуточный веб-сервер (выполняя танец OAuth и отправляя маркер доступа пользователю), необходимо будет также проксировать все взаимодействия службы, так как требуется ключ / секретный ключ потребителя. для подписания каждого запроса. Является ли это единственным способом сохранить ключ / секрет потребителя вне мобильного приложения и хранить его в более безопасном месте на промежуточном веб-сервере?

Альтернатива
Есть ли альтернативы для этого прокси? Можно ли хранить секрет потребителя на промежуточном веб-сервере и иметь какой-то механизм, который приложение Android (опубликованное на рынке и подписанное надлежащим образом) может сделать безопасный запрос к промежуточному веб-серверу, чтобы получить секрет потребителя и сохранить его? внутренне в приложении? Может ли быть реализован механизм, позволяющий промежуточному веб-серверу «знать», что это официальное приложение для Android, запрашивающее получение секрета потребителя, и что промежуточный веб-сервер будет передавать секретную информацию только этому конкретному приложению для Android?

1 Ответ

52 голосов
/ 12 декабря 2010

Резюме : Я бы просто рискнул и сохранил секрет в клиентском приложении.

Альтернативный прокси-сервер :

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

Но теперь вы попадаете в сферу множества других проблем.необходимость иметь дело с надежностью и масштабируемостью.

Долгие размышления о том, почему простой прокси не работает :

Некоторые люди, сталкиваясь с проблемой, думают«Я знаю, я добавлю свой собственный прокси-сервер». Теперь у них есть две проблемы.(с извинениями Джейми Завински)

Ваши предположения в основном верны.Вплоть до того момента, когда вы начинаете думать о своем собственном сервере, хранит ли он секрет и проксирует вызовы клиентского приложения, или пытается определить, является ли приложение легитимным, и дать ему секрет.В обоих подходах вам все еще нужно решить проблему «этот запрос исходит из фрагмента кода, который я написал»?

Позвольте мне повторить - нет способа различить на проводечасть программного обеспечения работает.Если данные в сообщениях выглядят правильно, ничто не может доказать, что это другое приложение отправляет это сообщение .

В конце концов, если я пишу вредоносное приложение, мне все равно,Я на самом деле знаю настоящий секрет, пока я могу заставить кого-то, кто знает, что делать работу от моего имени.Итак, если вы считаете, что вредоносное приложение может олицетворять ваше приложение на сторонних серверах OAuth, почему вы уверены, что оно не может олицетворять ваше приложение с вашим прокси?

Но подождите, это еще не все.Домен, в котором находится ваша прокси-служба, является вашей идентификацией как для ваших клиентов, так и для поставщика OAuth (как показано конечному пользователю поставщиком OAuth).Если вредоносное приложение может заставить ваш сервер делать плохие вещи, ваш ключ не только аннулируется, но и ваша общедоступная сетевая идентификация также больше не является доверенной.


Начну с очевидного - пути нетразличать по проводам, что конкретная часть программного обеспечения работает.Если данные в сообщениях выглядят правильно, ничто не может доказать, что это другое приложение отправляет это сообщение.

Таким образом, любой алгоритм, использующий хранимый секрет на стороне приложения, может быть подделан.Сила OAuth заключается в том, что он никогда не передает учетные данные пользователя приложению, а вместо этого дает временные учетные данные приложения, которые пользователь может отозвать при необходимости.

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

Однако один из способов смягчить это - подход Google, заключающийся в использовании 3-стороннего OAuth вместо стандартного 2-стороннего.,В трехстороннем OAuth нет предварительно назначенного секрета, но при каждой аутентификации выдается новый секрет токена доступа вместе с каждым токеном доступа.Хотя в конечном итоге это имеет тот же недостаток, поскольку плохое приложение может прочитать секретный токен хорошего приложения из своего процесса, оно приводит к тому, что пользователю приходится утверждать доступ к приложению каждый раз, когда ему нужен новый токен доступа.

И, конечно, это также означает, что это немного более неудобно и раздражает пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...