face

Не всякий баг вреден

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

Дело было так. Фирма X (конкретное название во сне не фигурировало) захватила здоровенный кусок рынка мобильных телефонов. Чуть ли не каждый второй телефон в стране был моделью Y этой фирмы. Была только одна позиция, по которой фирма X проигрывала конкурентам: у них в телефонах была возможность загружать приложения — у кого-то Java, у кого-то Symbian, — а у X никакой платформы для загружаемых приложений не было. Фирма X могла бы выпустить новую модель телефона, но большинство пользователей были до поры до времени довольны моделью Y, и немногие из них стали бы покупать новый телефон только ради загружаемых приложений. А между тем, фирме X загружаемые приложения были весьма нужны, ведь на них можно зарабатывать. Рассматривался вариант бесплатного обновления прошивки существующих телефонов модели Y в сервис-центрах, но и этот вариант оказался неудовлетворительным: сервис-центры в регионах большой страны работают так долго, что исполнения этой бесплатной услуги пользователю пришлось бы ждать неделями, так что едва ли многие пользователи воспользовались бы такой возможностью. (Это на самом деле так. Когда мне потребовалось перезалить прошивку в порядке гарантийного ремонта, телефон мне вернули через месяц.)

Решение, которое в итоге было претворено в жизнь, нашли вовсе не маркетологи, а программисты. Один из них, услышав о данной проблеме, в шутку предложил свой вариант решения, и сам не предполагал, что его воспримут всерьёз. Дело в том, что незадолго до этого программист работал с исходниками прошивки для модели Y, внося в них изменения для использования в готовящейся к выпуску модели Z. Пересматривая код, он обнаружил ошибку в процедуре обработки цепных (chained) входящих SMS. Определённым образом некорректно сформированное цепное сообщение могло вызвать переполнение буфера, что приводило к теоретической возможности для злоумышленника исполнять произвольный программный код. Об этой уязвимости никто не знал, и случайно такая ситуация могла бы возникнуть в одном случае из миллиарда. Идея программиста состояла в том, чтобы использовать найденную уязвимость для удалённого обновления прошивки.

Так и было сделано. Естественно, ни о какой уязвимости пользователям не сообщалось. Фирма X просто предложила каждому желающему за символическую плату в $1 произвести «дистанционное обновление программного обеспечения мобильного телефона», после которого у телефона появятся новые возможности, в том числе возможность загрузки приложений. Для обновления требовалось отправить со своего телефона SMS на специальный номер (это было нужно для того, чтобы невозможно было отправить обновление в качестве сюрприза соседу). После этого на телефон пользователя приходило цепное сообщение, эксплуатирующее уязвимость (exploit). Оно состояло из нескольких секций и содержало минимальный загрузчик, которому передавалось управление. Загрузчик использовал GPRS, чтобы загрузить с сервера фирмы X новую прошивку (именно на оплату этого трафика и шёл один доллар, который фирма X передавала сотовому оператору). После проверки контрольной суммы прошивка прописывалась во флеш-память, и телефон перезапускался. (Для предотвращения неполной записи прошивки из-за разряда батареи, перед записью загрузчик требовал подключить зарядное устройство.) Кроме поддержки платформы для загружаемых приложений, новая прошивка содержала и другие изменения, в числе которых было, во-первых, исправление для упомянутой уязвимости, чтобы она не могла быть использована кем-либо ещё раз, а, во-вторых, возможность загрузки по GPRS новых прошивок и их установки (естественно, перед установкой проверяется электронная подпись файла). На всякий случай.

In English: Not Every Bug is Bad
  • Current Music: Avril Lavigne - Losing Grip