Комментарий к «Как попасть на дачу президента в пять часов утра»

в 12:58, , рубрики: анализ кода, аудит кода, Блог компании PVS-Studio, закладки, информационная безопасность, ошибки в коде, сертификация, уязвимости

Комментарий к «Как попасть на дачу президента в пять часов утра» - 1Было бы странно, заниматься поиском ошибок в программах и при этом пройти мимо этой статьи.

Хочу оставить ряд комментариев. Основной их смысл, что это не похоже на страшные закладки. Мне этот код больше напоминает какой-то тестовый прототип, а не готовое приложение. Так что возможно не всё так страшно, как преподносит автор в статье. Во-первых, код содержит ошибку и случайные числа используются всегда. В реальности мимо такого вряд ли прошли в процессе тестировании системы. А во-вторых, существует такое понятие как «сертификация программ». И приведенный фрагмент кода — первый кандидат на обнаружение.

Мой скепсис касательно величины угрозы

Так получилось, что буквально несколько дней назад я рассказывал коллегам о примере закладки, в которой использовалась функция rand(). Не помню с чего началось обсуждение, но в его процессе я приводил примеры, что примитивный поиск всех функция random иногда имеет смысл и не надо над этим смеяться. Я читал или видел презентацию, где приводился соответствующий пример.

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

По закону подлости, я не смог найти эту статью или презентацию, чтобы сослаться на неё. Знаю, что я точно что-то такое читал, но совершенно не помню, когда и где. Поэтому прошу прощения, но дать ссылку на proof не могу.

А рассказывал я всё это коллегам, чтобы пояснить, что даже такое простое действие как просмотр всех мест в программе, где используются определённые функции, не такое уж бессмысленное занятие. Понятно, что закладку можно запрятать так хитро, что её никто не найдёт. Но тем не менее даже такой простой метод иногда даёт полезный результат, когда мы имеем дело не с хитрым отделом спецслужб, а просто с недальновидным программистом.

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

Первое. Это похоже больше на прототип, а не оконченное решение

Для начала, рассмотрим этот фрагмент кода:

unsigned short Hours, Minutes;
....
bool hungrytest = Hours && Hours > 5 && Hours < 6 &&
                  Minutes > 0 && Minutes < 30;
....
CreatePoint_(post, advangle,
             hungrytest ? PureDataRFZY_[posrt].r_fr : random(100));

Автор статьи возможно слабо знаком с языком Си++ или был недостаточно внимателен. На самом деле, нет никакой уязвимости системы утром с 5.01 до 5.29. Если уж на то пошло, система уязвима круглосуточно.

Выражение написано неправильно. Обратите внимание, что переменная 'Hours' имеет целочисленный тип. Это значит, что какое бы значение не хранилось в переменной Hours, условие «Hours > 5 && Hours < 6» всегда является ложным.

Это значит, что переменной 'hungrytest' всегда присваивается значение 'false'. И как следствие функция random(100) вызывается независимо от текущего времени.

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

Этот и другие приведенные фрагменты кода на мой взгляд говорят, что этот какой-то недоделанный прототип. Конечно, у меня слишком мало данных, но ощущение именно такое.

Например, предупреждение «ОАО НПП… не оплатило разработку....». Как по мне, что эта некая защита на всякий случай, вставленная в прототип, выданный кому-то «на попробовать».

Жесткий сетевой адрес 192.168.88.88 скорее всего сделан для удобства отладки. И так далее. Или этот фрагмент кода вообще просто ещё не был дописан на тот момент.

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

Второе. Подобные программы положено сертифицировать

Ответственное программное обеспечение проходит сертификацию. Я мало знаком с этой областью, но знаю, что сертификация существует и код с явными закладками её не пройдёт.

Для поиска уязвимостей и закладок существует соответствующий инструментарий. Это специализированные статические анализаторы кода, ориентированные на поиск мест в программе, который могут представлять угрозу безопасности. Как я понимаю, минусом таких инструментов является большое количество ложных срабатываний. Но тут ничего не поделаешь. Приходится просматривать работу с опасными функциями, такими как scanf() и т.д.

Это кстати отличает подобные инструменты от классических анализаторов кода, таких как например наш PVS-Studio. Мы ориентируем PVS-Studio для регулярного поиска новых ошибок. А инструменты сертификации мало пригодны для такого режима в силу большого количества выдаваемой информации. Поэтому, как я понимаю, их принято применять к коду уже законченного программного проекта.

Разработкой таких инструментов в нашей стране занимаются такие компании как Эшелон (АК-ВС), Positive Technologies и так далее.

В том числе эти инструменты укажут на участки кода, где используются такие функции как rand(), random() и так далее. Это явно делается, раз удалось найти закладку в банковском ПО, о которой я упоминал в самом начале статьи.

Так что не думаю, что мы имеем дело со сданным в эксплуатацию кодом. Он явно бы не прошел сертификацию. А если этот код не сертифицировался, то возможно мы имеем дело с некритичной системой.

Заключение

Статья «Как попасть на дачу президента в пять часов утра» подучилась очень интересной. Выражаю автору благодарность. В статье поднята интересная тема, можем ли мы доверять системам, ответственным за безопасность.

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

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

P.S.

Автор поста так и не ответил мне, могу ли выполнить перевод этой статьи и разместить её на сайте viva64.com. Прошу прислать мне весточку на эту тему.

Автор: PVS-Studio

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js