Разбираем M10: Extraneous Functionality на практике
AndroidGuardsЕсть в OWASP Mobile Top 10 пункт про "скрытую" фуннкциональность. Он стоит аж на 10-м месте, что несколько снижает его важность в глазах общественности. И это совершенно напрасно, потому что разработчики до сих пор выкатывают в продакшен код, содержащий отладочную функциональность и это очень частое явление. Некоторые компании, на которые мы не будем показывать пальцем, присваивают таким багам статус "informative" и ничего с ними не делают годами. В чем же проблема? Давайте разбираться.
Давным давно, когда сервера были маленькими, приложения глупыми, а разработчики ленивыми - я видел сервис, которому достаточно было в любой запрос передать параметр dev=1 и такой запрос не требовал аутентификации вообще. Изменилось ли что-то с тех пор...
Расскажу на примере такого явления как "дебаг-панели aka dev menu", но это в равной степени касается любых "скрытых" функций. Как правило в дебаг панель выносят возможность выбора сервера, установку или сброс каких-то значений из настроек, задание произвольного баланса (что удобно для финансовых приложений), да и вообще все, что угодно для удобства разработчика и тестировщика. Это все полезно и правильно. Неправильно выкатывать это на пользователей.
Да это все равно никто не найдет...
Думает разработчик и пишет код вида:
class UserSettingsFragment : Fragment() {
private var times = 0
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.transperentButton.setOnClickListener {
tickleThePickle()
}
}
private fun tickleThePickle() {
if (times < 8) {
times++
return
}
times = 0
navigate(R.id.action_SettingsFragment_to_DebugFragment)
}
}
Прозрачная кнопка где-нибудь возле номера версии, магическое число нажатий для открытия заветного фрагмента. Узнали себя? ;)
Такой код, даже в обфусцированном виде, точно найдет тот, кто будет изучать декомпилированный код вашего приложения.
Да там всего-лишь переключение сервера, что вы мне сделаете?
Даже возможность переключить сервер уже дает расширение поверхности атаки злоумышленнику. До этого он не знал, что у вас есть еще какие-то другие сервера, а теперь знает. И точно включит их в свой "план работ".
Что можно встретить на dev-серверах:
- Полное отсутствие аутентификации или ее сильно упрощенный вариант
- Аккаунты тестировщиков, которые пишут в чат матерные слова, а иногда полезную информацию
- Полные или частичные копии production-данных
- Открытые порты с устаревшими или плохо настроенными сервисами
- Каталог .git в корневой директории
- Девопса-наркомана, который для удобства включил листинг директорий
- Да и много чего еще...
В ней было нечто первозданно–мощное, нечто, знакомое ему по Ночному Городу, знакомое и хранившее его, хранившее — до времени — от времени и смерти, от безжалостной, всепожирающей Улицы... Нечто, относившееся — он знал это всегда и вспомнил сейчас, увлекаемый в гнездо из рваных тряпок — к сфере плоти, к сфере мяса, презираемого всеми ковбоями. Нечто непомерно огромное, безнадежно непознаваемое, океан информации, закодированный в феромонах и винтовых лестницах аминокислот, бесконечная сложность, разобраться в которой под силу только слепому, нерассуждающему телу.
Что делать?
Я вижу только один надежный способ избежать всех описанных выше проблем и при этом сохранить удобство разработки и тестирования: Build Variants

Т.е. все ваши дебаг панели, нужно располагать в тех вариантах, которые не уезжают пользователям, а в релизе на их местах должны быть заглушки ну или как придумаете. Проще говоря - отладочный код вообще не должен попадать в релизный билд. В противном случае вас ждут все обозначенные выше проблемы. Вы точно не захотите защищать свои dev-сервера так, как делаете это с prod-серверами. А даже если захотите и какое-то время будете это делать, то в конце концов вы устанете. И ошибетесь. Обязательно ошибетесь.
Бизнес требовал постоянной интуиции, и смерть воспринималась как естественное наказание за лень, беззаботность, отсутствие такта, за неумение приспособиться к запутанному этикету черного рынка.