Чтобы иметь возможность лучше "отвечать за базар", смещусь-ка я из области рассказов о базовой сети GSM (которая все-таки от меня несколько далеко) в область GSM-related IT, которое мне гораздо ближе :)
Итак, заказной пост на тему: "
В какой-то из древних баек встретил момент, когда бравый рассказчик отдаёт злоумышленникам сгенерированный код карточки пополнения счёта на большое отрицательное число. Такие бывают? Есть ли доступные методы генерации таких кодов, чтобы наказывать разных вредных личностей? :)"
Короткий ответ: карточки бывают, а методов - нет :)
Длинный ответУ меня есть большое подозрение, что я знаю, откуда (или от кого) пошла по миру эта баечка и первый раз я ее услышал из первых рук где-то в начале 2004-го года, после чего мне непосредственные участники процесса демонстрировали принципиальную возможность описанного "фокуса"[1].
Впрочем, даже если бы мне ничего не показывали, все равно можно было рассуждать о том, возможно это или нет, зная, как работает механизм.
А механизм работает очень просто.
В сети оператора есть сервер (назовем его ваучер-сервером), который хранит тройки (код карты, период валидности карты, сумма пополнения). К этому серверу обращается та система, через которую происходит пополнение (а оно может быть сделано по USSD, через IVR или "вручную" - при помощи оператора call center). При обращении происходит проверка наличия карточки с указанным кодом, попадание даты пополнения в период валидности карты, и собственно изменение пополняемого баланса на сумму пополнения.
Как видно, система проста, как автомат Калашникова и обладает некоторыми вроде бы очевидными свойствами:
1)Код карточки никаким образом не содержит информации о сумме пополнения
2)В ваучер-сервере хранится информация о реальных кусках картона/пластика - о картах, которые уже находятся в продаже или в процессе выпуска в продажу.
Очевидно, что доступного способа "сгененировать" карту пополнения с отрицательной суммой пополнения - нет. Сделать это может только тот, кто имеет доступ к ваучер-серверу.
А теперь - бонус. Рассмотрим, насколько реальны всякие "генераторы кодов пополнений", которые в изобилии продаются в интернете.
Очевидно, что код пополнения нельзя "сгенерировать". Масимум - его можно подобрать/угадать. Рассмотрим, насколько велика вероятность угадать код карты пополнения. Допустим, у оператора мобильной связи 20 млн абонентов. Оператор выпускает на рынок 200 млн карт пополнения разных номиналов (я преувеличиваю, но для красоты изложения, пусть так и будет). Код карты пополнения состоит из 14 цифр. Таким образом, всего может быть 10^13 разных кодов карточек, из которых использованы 2*10^8. Следовательно, вероятность того, что взятое наугад 14-и значное число является валидным кодом карточки пополнения составляет 2*10^8/10^13 = 0.00002.
Получается, что перебрав где-то десять тысяч номеров, у вас есть шанс угадать код карточки. Но стоит ли игра свеч? Врядли. Во-первых, интерфейс ваучер-сервера специально сделан так, чтобы перебор нельзя было делать быстро, и попытки подбора легко идентифицировались и докладывались "кому надо". Во-вторых, если карточку, код которой вы "угадали", кто-то купит, и обратиться к оператору с жалобой, что она уже использована, то конфликт с большой вероятностью будет решен в его пользу, а с вашего счета в лучшем случае спишут деньги, а в худшем - его заблокируют. В-третьих, если вы вдруг поставите дело "на поток", то вами наверняка заинтересуются неулыбчивые люди из СБ оператора, которые подключат неулыбчивых людей из госструктур и постараются напроситься в гости, что всегда неприятно :)
[1]:
Напомню, о чем шла речь. Вам звонят/присылают SMS и сообщают, что вы победили в лотерее и выиграли СуперПриз, но чтобы получить его - надо заслать куда-то код пополнения с карточки, стоящей существенную сумму денег (вариант: пришлите нам код с карточки номиналом X, а мы вам пополним код на сумму 2*X). Если вы доверчиво покупаете карточку и сообщаете код, то злоумышленники тут же с помощью этого кода пополняют (на сумму Х) счет запечатанного "стартового prepaid пакета" стоимостью Y и продают его на улице за сумму Y+X/2 (напомню, что в украинских реалиях возможно стать абонентом, не предъявляя никаких ID/паспортов/...). Таким образом, злоумышленники получают прибыль в размере X/2, пострадавший теряет деньги на сумму X.
И вот такие злоумышленники звонят жене сотрудника одного из операторов и представляются сотрудниками этой же компании-оператора. Жена тут же звонит мужу, чтобы уточнить, действительно ли есть такая мега-акция. В результате, муж передает жене код ваучера, пополняющего счет на некую отрицательную сумму, и злоумышленники, таким образом, оказываются ни с чем.
Был запечатаный стартовый пакет с 5-ю гривнами на счету, который оператор продает за, допустим, 25 грн (типа, 20 грн - стоимость симки). Жулики потратили 25 грн и купили его в магазине.
Жулики выдурили у жертвы ваучер на 100 грн, и пополнили этот пакет. Теперь там 105 грн.
Жулики продают этот пакет ушлому покупателю за 75 грн. Ушлый покупатель при них вставляет симку в телефон и убеждается, что там реально 105 грн, и, довольный, уходит.
Считаем:
Ушлый покупатель купил карточку со счетом в 105 грн за 75 грн вместо 125 грн. Итого - экономия 50 грн.
Жулики потратили 25 грн, а затем получили 75 грн. Итого - навар 50 грн.
Жертва потратила 100 грн и не получила ничего. Эти 100 грн "поделили" между собой ушлый покупатель и жулики.
Аналогия из компьютерного мира: представьте, что кто-то "раскачивает" персонажей WoW или Lineage 2, выдуривая игровые "деньги", ресурсы, ману или что там для этого нужно, у других игроков. А потом продает "раскачаных" героев за реальные деньги ленивым игрокам.
Хотя, возможно, это и багофича.
2. То есть, если в базу будет занесена запись о карточке с отрицательной суммой, то она сработает. Но для этого нужно иметь прямой доступ к базе. А вот вопрос - поле данных в базе, в котором хранится сумма пополнения - оно знаковое или беззнаковое? ;)
2. А оно - знаковое :) (понятное дело, что не факт, что в любом ваучер-сервере любого поставщика это так)
А куда ещё один разряд делся?
Спасибо.
В первом случае, человек-отправитель посылает SMS или USSD специальной структуры, в котором указан получатель и сумма. Специальный сервер проверяет доступность получателя и доступность суммы, и выполняет собственно перенос "денег" с одного счета на другой, запрашивая необходимые подтверждения и уведомляя участников.
Во втором случае, платежный терминал после приема денег от абонента связывается с ваучер-сервером, просит того "сегенрировать" новый ваучер на указанную сумму, принимает от ваучер-сервера код такого виртуального ваучера, и печатает код на бумажном чеке. После чего все происходит обычным порядком - код вбивают в телефон, он валидируется, и происходит пополнение.
Возможность мошенничества в этом случае можно отсекать, проверяя приход нужной суммы денег через банковский платежный интерфейс до того, как генерируется ваучер.
Отвечу вопросом на вопрос: а какой софт стоит у провайдеров интернет? Или даже не так: а какой софт стоит у пользователей персональных компьютеров? :)
Если коротко - то всякий :) Если длинно - то могу рассказать про reference model-и бизнес-процессов компаний-операторов мобильной связи, и про _минимальный_ набор функций (реализуемый в софте), который необходим для их выполнения. Хотя что-то я не уверен, что у меня получится сжато и внятно это рассказать... Ключевые слова: e-TOM.
По поводу протоколов тоже все непросто. С одной стороны, сейчас есть сразу несколько попыток все стандартизировать и причесать, с другой стороны - этим попытки были предприняты достаточно недавно, и у многих операторов к тому моменту уже был пестрый зоопарк решений и протоколов, который чем дальше, тем становится больше и пестрее :) Ключевые слова, имеющие отношение к предмету: NGOSS, Parlay API, JAINE API.
Даже если бы мошенник захотел из принципа пойти качать права - кому бы он стал жаловаться и какие доказательства предъявлять? :)
Опоздал к обсуждению, но все же кину свои 5 копеек.
Карточка в "ваучер-сервере" имеет гораздо больше состояний, чем простые "В печати", "В продаже". Работал с биллингом, в котором таких состояний было 13 или 14. Сегментация состояний делается как раз для того, чтобы снизить вероятность подбора кодов. Ну, т.е. допустим в базе хранится 100млн карт, а в розничной сети крутится 10000 карт, т.е. закинуть на баланс можно только те карты, которые помечены как доступные, не смотря на то, что карта с угаданным пин-кодом реально существует. Вероятность подбора пин-кода вообще пренебрежимо мала.