Приближается Google I/O, где нам расскажут много нового и интересного про безопасность в Android (или нет). На текущий момент есть предварительный анонс нового раздела в Google Play — Safety section. Эта штука позволит пользователям лучше понимать какие данные приложение собирает и какие механизмы безопасности для защиты этих данных задействует.
Если кто-то подумал, что это будет какая-то добрая магия и вам ничего не нужно будет делать, то у меня для вас плохие новости: все вносится руками. Google просто добавит соответсвующие поля в настройки приложения. Сейчас известно про такие настройки:
- Используемые практики по обеспечению безопасности, например шифрование
- Следует ли приложение
- Описание данных, которые приложение собирает и зачем оно их куда-то передает
- Проходило ли приложение внешний аудит
- Есть ли в приложении возможность запросить полное удаление данных при деинсталляции
Конечно же в этих полях можно написать полную ерунду и сказать всем, что у вас самое безопасное приложение. Поэтому в Google пообещали ловить таких хитрожопых разработчиков и требовать от них нормального заполнения. Если требование будет проигнорировано, то заблочат аккаунт. Как это будет работать в реальности — непонятно. Будут ли проводиться эти проверки до публикации в стор или уже после. Сколько времени дадут на реагирование, на сколько итераций исправлений можно будет зайти до того как в Google решат, что ты им делаешь мозги, ну и т.д.
Обязать разработчиков заполнять эти данные обещают со второго квартала 2022 года.
https://android-developers.googleblog.com/2021/05/new-safety-section-in-google-play-will.html
Если кто-то подумал, что это будет какая-то добрая магия и вам ничего не нужно будет делать, то у меня для вас плохие новости: все вносится руками. Google просто добавит соответсвующие поля в настройки приложения. Сейчас известно про такие настройки:
- Используемые практики по обеспечению безопасности, например шифрование
- Следует ли приложение
Families policy (если вы пишите приложения для детей)- Описание данных, которые приложение собирает и зачем оно их куда-то передает
- Проходило ли приложение внешний аудит
- Есть ли в приложении возможность запросить полное удаление данных при деинсталляции
Конечно же в этих полях можно написать полную ерунду и сказать всем, что у вас самое безопасное приложение. Поэтому в Google пообещали ловить таких хитрожопых разработчиков и требовать от них нормального заполнения. Если требование будет проигнорировано, то заблочат аккаунт. Как это будет работать в реальности — непонятно. Будут ли проводиться эти проверки до публикации в стор или уже после. Сколько времени дадут на реагирование, на сколько итераций исправлений можно будет зайти до того как в Google решат, что ты им делаешь мозги, ну и т.д.
Обязать разработчиков заполнять эти данные обещают со второго квартала 2022 года.
https://android-developers.googleblog.com/2021/05/new-safety-section-in-google-play-will.html
Android Developers Blog
New safety section in Google Play will give transparency into how apps use data
Posted by Suzanne Frey, VP, Product, Android Security and Privacy (Update 7/28/2021: Some details of this proposal have changed so ...
Ребята с дружественного канала @mobile_appsec_world будут проводить вебинар по динамическому анализу мобильных и web приложений. При этом обещают не утомивший всех “разнотык” и прочие “кавычки”, а прямо автоматизацию этого процесса.
Сей дивный праздник состоится 25го мая с 15:00 до 17:00 по МСК. Но в Москве, как известно, тяжело жить без регистрации, поэтому вот вам ссылка где эту регистрацию можно получить 😎
Сей дивный праздник состоится 25го мая с 15:00 до 17:00 по МСК. Но в Москве, как известно, тяжело жить без регистрации, поэтому вот вам ссылка где эту регистрацию можно получить 😎
Давненько ничего не выкладывал на YouTube и на то были причины. Но о них как-нибудь потом. По ссылке найдете лекцию по основам информационной безопасности, которую я читал в рамках "Робопрактики", которую компания red_mad_robot каждый год проводит для мобильных разработчиков. В лекции можно найти:
- Основные понятия из мира ИБ
- Моделирование злоумышленников и угроз
- Основы криптографии (симметричная, асимметричная, цифовые подписи, сертификаты, хэш-функции, KDF-функции)
- HTTP vs HTTPS, MITM и SSL Pinning
- Основные угрозы мобильных приложений
Материал подойдет для всех грейдов разработчиков, которые желают разобраться в вопросах информационной безопасности или как-то систематизировать свои знания. Видео вышло довольно длинным, поэтому я добавил туда максимально гранулярные таймкоды. Короч я старался, похвалите меня 😄
https://youtu.be/oZEFUA-unDo
- Основные понятия из мира ИБ
- Моделирование злоумышленников и угроз
- Основы криптографии (симметричная, асимметричная, цифовые подписи, сертификаты, хэш-функции, KDF-функции)
- HTTP vs HTTPS, MITM и SSL Pinning
- Основные угрозы мобильных приложений
Материал подойдет для всех грейдов разработчиков, которые желают разобраться в вопросах информационной безопасности или как-то систематизировать свои знания. Видео вышло довольно длинным, поэтому я добавил туда максимально гранулярные таймкоды. Короч я старался, похвалите меня 😄
https://youtu.be/oZEFUA-unDo
YouTube
👨🎓Открытая лекция: Основы информационной безопасности для мобильных разработчиков
Лекция прочитана в рамках "Робопрактики" для мобильных разработчиков.
Содержание лекции:
1. Основные понятия из мира ИБ
2. Моделирование злоумышленников и угроз
3. Основы криптографии (симметричная, асимметричная, цифовые подписи, сертификаты, хэш-функции…
Содержание лекции:
1. Основные понятия из мира ИБ
2. Моделирование злоумышленников и угроз
3. Основы криптографии (симметричная, асимметричная, цифовые подписи, сертификаты, хэш-функции…
Давно не создавал ключи подписи для приложений, а когда попытался, то напоролся на интересную ошибку про невозможность создания ключа с разными паролями на хранилище и на сам ключ. Покопавшись в интернетах быстро выяснил, что это известная проблема с Android Studio 4.2 и в качестве эльфийского костыля предлагается... сделать пароль на хранилище и на ключ одинаковыми. "Отличный совет", который полностью противоречит официальной документации. Более глубокие раскопки показали, что студия версии 4.2 работает на JDK 11, в которой для keystore по умолчанию используется формат PKCS12. Соответственно keytool и пытается создать именно его. Если попробовать сделать это из терминала, то можно увидеть вот такое сообщение:
Ок, но как же так... Оказалось, что "проблема" известна аж с 2013го года и все работает как ожидается. Потому что (цитирую): Файл pkcs12 с различными паролями на хранилище и на ключ является (почти) бесполезным, потому что другие тулы (MSIE, Firefox и т.д.) принимают такие файлы только с одинаковыми паролями на ключ и хранилище. Поэтому keytool работает таким образом.
Собственно почему мы на это все попали только сейчас? Все просто. Google продолжает держать уверенный курс по направлению "подальше от Oracle" и всячески выпиливает всякие проприетарные штуки из Android окружения. А формат JKS как раз является проприетарным.
Сконвертировать свои старые JKS ключи в модный, молодежный PKCS12 можно так:
Warning: Different store and key passwords not supported for PKCS12 KeyStores. Ignoring user-specified -keypass value.Ок, но как же так... Оказалось, что "проблема" известна аж с 2013го года и все работает как ожидается. Потому что (цитирую): Файл pkcs12 с различными паролями на хранилище и на ключ является (почти) бесполезным, потому что другие тулы (MSIE, Firefox и т.д.) принимают такие файлы только с одинаковыми паролями на ключ и хранилище. Поэтому keytool работает таким образом.
Собственно почему мы на это все попали только сейчас? Все просто. Google продолжает держать уверенный курс по направлению "подальше от Oracle" и всячески выпиливает всякие проприетарные штуки из Android окружения. А формат JKS как раз является проприетарным.
Сконвертировать свои старые JKS ключи в модный, молодежный PKCS12 можно так:
keytool -importkeystore \
-srckeystore keystore.jks \
-destkeystore keystore.p12 \
-srcstoretype JKS \
-deststoretype PKCS12 \
-deststorepass password \
-srcalias alias \
-destalias aliasПроизошло целых два события: отгремела Google I/O 2021 и у меня нашлось время собрать всякую интересную инфу по privacy & security фишкам, которые там показали. Обзор получился довольно объемный, поэтому в описании вас традиционно ждут таймкоды и куча тематических ссылок. Смотрите, комментируйте, задавайте вопросы. Там есть что обсудить!
https://youtu.be/2Mtdo84dI4M
https://youtu.be/2Mtdo84dI4M
YouTube
🕵️♂️ По следам Google I/O 2021: Безопасность и приватность 😎
На Google I/O 2021 нам прямо со сцены заявили, что теперь "privacy by default" и вообще все будет хорошо. В этом видео я расскажу про плюшки для пользователей, проблемы для разработчиков и покажу немного кода для иллюстрации изменений в Android 12.
Полезные…
Полезные…
Давайте попробуем понять, какого видео контента вам хочется больше.
Final Results
40%
Dev How-To — как закодить "безопасность" (пожелания в комментарии)
22%
Hack How-To — как сломать "безопасность" (пожелания в комментарии)
8%
Как пользоваться всяких хак-тулингом
17%
Фундаментальные знания по инфобезу
13%
Стримы где я буду 3 часа плохо играть на советской гитаре и петь дурные песни.
Мне тут коллеги с соседнего предприятия рассказали историю о том, что им пришло приложение от не самой распоследней конторы на аудит. И первым, что бросилось в глаза, было наличие релизного ключа в каталоге с проектом и заботливо прописанных креденшелов к нему в build-файле. Скажу очевидную мысль: никогда так не делайте 😄 А если узнали свое приложение, то поменяйте пароли на ключ и будьте счастливы.
А надо делать? Не в такой ситуации, а вообще. Вопрос большой и дискуссионный, но я бы посоветовал рассмотреть такие варианты:
- Назначить "хозяина ключей". Это может быть тим/техлид, который в нужное время будет спускаться с небес и подписывать ваше многострадальное приложение
- Убрать все ключи на CI чтобы все подписывалось там.
Я не хочу давать оценку ни одному из этих вариантов. Надеюсь что вы с этим справитесь самостоятельно.
А надо делать? Не в такой ситуации, а вообще. Вопрос большой и дискуссионный, но я бы посоветовал рассмотреть такие варианты:
- Назначить "хозяина ключей". Это может быть тим/техлид, который в нужное время будет спускаться с небес и подписывать ваше многострадальное приложение
- Убрать все ключи на CI чтобы все подписывалось там.
Я не хочу давать оценку ни одному из этих вариантов. Надеюсь что вы с этим справитесь самостоятельно.
Бывает смотришь на девушку и думаешь — DAST или не DAST... Впрочем о чем это я... А, подкаст новый записали. На этот раз обсуждаем все прелести DAST анализа с ребятами, которые неплохо в этом разбираются. В выпуске присутствует жесткая критика MobSF, поэтому слабонервных прошу поаккуратнее с прослушиванием 😉
Послушать выпуск можно в Google/Apple подкастах и на Youtube:
🎥 YouTube: https://youtu.be/imrlMLVOTRY
🎙 Google Podcasts: https://bit.ly/360XYIi
🍏 Apple Podcasts: https://apple.co/3vWFYte
Послушать выпуск можно в Google/Apple подкастах и на Youtube:
🎥 YouTube: https://youtu.be/imrlMLVOTRY
🎙 Google Podcasts: https://bit.ly/360XYIi
🍏 Apple Podcasts: https://apple.co/3vWFYte
YouTube
🎙 Community Podcast #3: Травим баги DAST-ом
Продолжая тему анализаторов приложений говорим про Dynamic Analysis Security Testing (DAST) или попросту "динамику". А чтобы не говорить ерунды, я решил позвать ребят из компании Stingray, которые как раз пилят такой анализатор. Зачем они вообще за это взялись…
Вам когда-нибудь было интересно как эволюционировали подходы к обеспечению безопасности в Android? Если да, то вот статья способная хоть немного удовлетворить ваш интерес. Это хороший обзор того, как Google улучшала безопасность и приватность операционной системы начиная с версии 4.4 и до наших дней. Ну и автор — не хрен с горы, а известный в нашем теплом мобильном инфобезе @Mr_R1p. Так что заваривайте свою любимую "принцессу Нури", доширак и наслаждайтесь чтением.
P.S. Статью уже репостили в чат канала, но автор репоста любезно согласился удалить сообщение, чтобы избежать дублирования 😎
P.S. Статью уже репостили в чат канала, но автор репоста любезно согласился удалить сообщение, чтобы избежать дублирования 😎
Хабр
Развитие механизмов безопасности Android (от версии к версии)
Привет, Хабр! Я занимаюсь безопасностью мобильных приложений и с удовольствием слежу за развитием платформ Android и iOS, которые с каждым новым релизом становятся все привлекательнее для...
Каждый раз когда я говорю "не пишите свою криптографию, у вас нет для этого достаточного количества знаний", вы мне возможно не верите и думаете: ну уж я то разбираюсь, даже половину "прикладной криптографии" прочитал. В таком случае у меня для вас есть статья, где очень круто показано, что даже специалисты ошибаются. В статье речь идет о слабых алгоритмах генерации случайных чисел, которые применялись в парольном менеджере от Лаборатории Касперского. Читается на одном дыхании (почти) и наглядно демонстрирует как находят уязвимости в ГПСЧ.
⚠️ Осторожно, все что вы прочитаете дальше в этом сообщении — теория заговоров и так не бывает.
А еще злые языки говорят, что в некоторые криптографические алгоритмы специально вносятся уязвимости. При чем порой настолько хитро, что нужно обладать очень глубокими знаниями в математике и криптографии чтобы эти уязвимости найти. А вот кто вносит эти уязвимости и зачем — я вам не скажу 😉 Статью читайте. Нечего про всякие глупости думать.
⚠️ Осторожно, все что вы прочитаете дальше в этом сообщении — теория заговоров и так не бывает.
А еще злые языки говорят, что в некоторые криптографические алгоритмы специально вносятся уязвимости. При чем порой настолько хитро, что нужно обладать очень глубокими знаниями в математике и криптографии чтобы эти уязвимости найти. А вот кто вносит эти уязвимости и зачем — я вам не скажу 😉 Статью читайте. Нечего про всякие глупости думать.
Ledger
Kaspersky Password Manager: All your passwords belong to us | Ledger
The password generator included in Kaspersky Password Manager had several problems. The most critical one is that it used a PRNG not suited for cryptographic purposes. Its single source of entropy was the current time. All the passwords it created could be…
🔥1
Попалась мне тут книжка — Android глазами хакера. И решил я ее почитать и составить свое мнение. Делал заметки по ходу чтения и решил, что неплохо бы с кем-нибудь ими поделиться. Для тех, кому вечно "некогда", вот главная мысль — Книга отлично подойдет для тех, кто только начинает или хочет начать погружаться в мир android инфобеза
Для всех остальных есть такая ссылка — https://youtu.be/urgbx0QmHxs
Для всех остальных есть такая ссылка — https://youtu.be/urgbx0QmHxs
YouTube
📚 Pro книги: Android глазами хакера
Обзор книги "Android глазами хакера" (Е. Зобнин). Рассказываю о чем книга, стоит ли она вашего внимания и какие плюсы/минусы я для себя вынес.
⁉️ FAQ: https://github.com/Android-Guards/faq
⁉️ FAQ: https://github.com/Android-Guards/faq
Появилась новая инфа по safety section в GooglePlay, о которой я как-то писал. Теперь на это можно посмотреть в картинках и начать готовиться к ее появлению.
Открыть ее для заполнения в консоли разработчика обещают в октябре. Чуть больше подробностей тут.
Открыть ее для заполнения в консоли разработчика обещают в октябре. Чуть больше подробностей тут.
YouTube
Introducing the new Data safety section in Google Play
The Data new safety section will provide developers a simple way to showcase their app’s overall safety. Developers will be able to give users deeper insight into their privacy and security practices, as well as explain the data the app may collect and why…
Когда я нахожу в списке пакетов приложения
Самый простой способ начать раскручивать алгоритм — поискать метод
Ну хоть не имя автора и то ладно. А дальше сгенерированный ключ попадал в файл:
Который сохранялся в песочнице приложения. Шах и мат =)
Как стоило бы решать такую задачу? Я вижу три способа:
1. Не решать ее вообще. Зачем вам шифровать всю базу данных? Что там такого содержится? Если там куча конфиденциально инфы, то лучше бы это вынести на сервер.
2. Шифровать только конкретные данные. Тут хорошо помогает генерация ключей в keystore и обычные операции шифрования конкретных значений, которые потом можно сохранять в БД.
3. Размазать алгоритм генерации пароля по всему приложению с заходом в нативные либы, использовать куски подписи приложения и всякое такое прочее. Потом осознать, что пароль все равно получат с помощью хука на методе
net.sqlcipher, то сразу чувствую дух приключений. Это же люди заморочились, решили сделать зашифрованную базу данных и чтобы все было безопасно и хорошо. В такие моменты всегда интересно, что же они придумали с хранением ключей шифрования. Обычно там ничего интересного или всякая "комнатная криптография" типа константы с именем автора закодированной в base64, но на этот раз я нашел кое что забавное.Самый простой способ начать раскручивать алгоритм — поискать метод
net.sqlcipher.database.getReadableDatabase. В который и передается пароль на открытие БД. Если вам повезло и туда передается не статическая строка "mysecretpassword", то начинайте искать артефакты 😉 В моем случае, дорога приключений привела меня в класс с совершенно ничего не говорящим названием DatabasePasswordManager, который содержал такой код:static SecretKey generatePassword() {
return new SecretKeySpec(UUID.randomUUID().toString().replaceAll("-", "").getBytes(StandardCharsets.UTF_8), "AES");
}
Ну хоть не имя автора и то ладно. А дальше сгенерированный ключ попадал в файл:
static void writeDatabasePassword(Context context, SecretKey secretKey, File file) {
....
byte[] wrap = keyWrapperFactory.createInstance(context, "db").wrap(secretKey);
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(wrap);
fileOutputStream.close();
return;
}Который сохранялся в песочнице приложения. Шах и мат =)
Как стоило бы решать такую задачу? Я вижу три способа:
1. Не решать ее вообще. Зачем вам шифровать всю базу данных? Что там такого содержится? Если там куча конфиденциально инфы, то лучше бы это вынести на сервер.
2. Шифровать только конкретные данные. Тут хорошо помогает генерация ключей в keystore и обычные операции шифрования конкретных значений, которые потом можно сохранять в БД.
3. Размазать алгоритм генерации пароля по всему приложению с заходом в нативные либы, использовать куски подписи приложения и всякое такое прочее. Потом осознать, что пароль все равно получат с помощью хука на методе
getReadableDatabase и написать защиту от фриды, xposed и... ну в общем вы поняли 😉Небольшая история о том, как сторонняя библиотека может умножить на ноль всю вашу обфускацию в приложении: https://telegra.ph/Among-Us-ProGuard-editon--ishchem-predatelya-credi-bibliotek-08-20
Эксперементирую с телеграфом =)
Эксперементирую с телеграфом =)
Telegraph
Among Us: ProGuard editon — ищем предателя cреди библиотек
Всем proguard/r8 джедаям посвящается Ты джедай обфускации, минификации и шринкинга. Ты а закрытыми глазами создаешь высококачественные файлы с правилами и всегда точно уверен в том, как будет выглядеть твой код в релизной сборке. Если это так, то послушай…
По случаю пятницы решил порадовать вас еще одним постом. На этот раз про то, как подружить Drozer со стоковым android эмулятором: https://telegra.ph/Drozer-ehmulyator-i-ehlfijskie-kostyli-08-20
Telegraph
Drozer, эмулятор и эльфийские костыли
Вам когда-нибудь хотелось странного? Например запустить drozer в docker-контейнере и достучаться с него до эмулятора на том же хосте? Казалось бы задача предельно простая и понятная. Запускаем эмулятор, на нем drozer-agent, пробрасываем порты, заводим контейнер…
Создатель Magisk-а опубликовал статью вносящую ясность в то, что будет происходить с проектом дальше. Если коротко, то дела такие:
- MagiskHide — все. У автора теперь есть доступ ко всему коду гугла поэтому такие штуки вызывают конфликт интересов.
- Репозиторий модулей — все. Автор устал заниматься модерацией.
- Ведется работа на Zygisk — части Magisk будут запускаться в Zygote.
- MagiskHide — все. У автора теперь есть доступ ко всему коду гугла поэтому такие штуки вызывают конфликт интересов.
- Репозиторий модулей — все. Автор устал заниматься модерацией.
- Ведется работа на Zygisk — части Magisk будут запускаться в Zygote.
Medium
State of Magisk: 2021
Ever since my employment at Google, crazy speculations has been spreading like wild fire all over the Internet. The out-of-context private…
Frida book.pdf
3.9 MB
Перевернул сегодня календарь, а там...
Какие-то добрые люди надергали из документации всяких полезностей по Frida и сделали из них удобную PDF-ку, которая будет очень полезна новичкам. Хотя, джедаям тоже будет на что посмотреть.
Что внутри:
- Краткая история фриды
- Установка и базовые компоненты
- Примеры решения задач: обход рута, поиск секретов, обход авторизации. В этом же разделе есть инфа про r2frida (джедаи тут?)
- Примеры инструментов базирующихся на фриде
- Коллекции скриптов
- Референсы на основании которых это все собиралось. Можно юзать как список для дальнейшего изучения.
#frida
Какие-то добрые люди надергали из документации всяких полезностей по Frida и сделали из них удобную PDF-ку, которая будет очень полезна новичкам. Хотя, джедаям тоже будет на что посмотреть.
Что внутри:
- Краткая история фриды
- Установка и базовые компоненты
- Примеры решения задач: обход рута, поиск секретов, обход авторизации. В этом же разделе есть инфа про r2frida (джедаи тут?)
- Примеры инструментов базирующихся на фриде
- Коллекции скриптов
- Референсы на основании которых это все собиралось. Можно юзать как список для дальнейшего изучения.
#frida
Довольно оперативно выложили материалы с прошедшей недавно Zero Nights 2021. По нашей теме там был только один доклад от Дмитрия Терёшина(@dtereshin) про проблемы SSDLC. В рамках доклада Дмитрий рассказал о внезапно появляющихся багах в релизных сборках и о том как их сбивать на подлете. А еще он презентовал свой тул
📹 Видео
👨🏻🏫 Слайды
👮 CheckKarlMarx
CheckKarlMarx, который выглядит как ваша обычная грепалка на питоне, только с отчетами 😉📹 Видео
👨🏻🏫 Слайды
👮 CheckKarlMarx
Решил немного разбавить посты про андройдно-мобильный инфобез постом на более широкую тему. В блоге Positive Technologies (запрещенная в США организация) вышла статья, с подборкой полезных ресурсов где можно почитать (а то и причаститься) про пентесты мобилок и веба, про реверс ВПО и про техники применяемые APT командами. Справедливости ради, стоит сказать, что подобную подборку, но на более узкую тему - reverse engineering я видел от компании Digital Security. Мне вообще нравится тренд, когда люди из индустрии и даже целые компании не закапывают знания внутри своего офиса, а делятся ими с сообществом. Хотелось бы видеть такие подборки чаще и было бы совсем хорошо если бы они на 90% состояли из материалов людей работающих в этих компаниях ;) Всем приятного чтения.
Хабр
Большая подборка полезных ресурсов от экспертов Positive Technologies: от лаб и подкастов до блогеров и сообществ
Хотите быть в курсе всего интересного, что происходит в практической информационной безопасности ? Знать, за чьими твитами стоит следить, где можно подружиться с коллегами по цеху, что в первую...
Довелось мне тут в очередной раз разворачивать с нуля пентестерское окружение на Android. А раз с нуля, значит надо сделать все правильно и красиво, поэтому решил закинуть сертификат для mitm-а в системные. В результате получился мини-гайд, который наверняка кому-то пригодится. Конечно есть и другие способы, с ремаунтом системного раздела и прочими приключениями. Но мне было как-то не до них :D
https://telegra.ph/Kak-sdelat-sertifikat-sistemnym-10-01
https://telegra.ph/Kak-sdelat-sertifikat-sistemnym-10-01
Telegraph
Как сделать сертификат системным
Покажу на примере BurpSuite, но эта инструкция применима к любой проксе. Предусловия: вы умеете настраивать прокси на устройстве и у вас установлен Magisk.
Решил немного порассуждать о скрытой функциональности в приложениях, показать какие с ней бывают проблемы и как их избежать.
https://telegra.ph/Razbiraem-M10-Extraneous-Functionality-na-praktike-10-07
https://telegra.ph/Razbiraem-M10-Extraneous-Functionality-na-praktike-10-07
Telegraph
Разбираем M10: Extraneous Functionality на практике
Есть в OWASP Mobile Top 10 пункт про "скрытую" фуннкциональность. Он стоит аж на 10-м месте, что несколько снижает его важность в глазах общественности. И это совершенно напрасно, потому что разработчики до сих пор выкатывают в продакшен код, содержащий отладочную…