Разработчикам мобильных приложений из компании Applidium удалось разобраться в протоколе коммуникации, который использует программа Siri, так что теперь этот движок распознавания речи теоретически можно запускать на любом устройстве, в том числе Android, если вы знаете, где добыть идентификатор iPhone 4S, и компания Apple не внесёт его в «чёрный список».
Ключевым элементом Siri является то, как программа общается с сервером (Siri работает только при наличии доступа в интернет). Трафик идёт по протоколу TCP, порт 443, на сервер 17.174.4.4. Если вы попробуете связаться с сервером https://17.174.4.4/ с десктопа, то увидите, что он предъявляет сертификат на имя guzzoni.apple.com (Дидье Гуззони из компании SRI — один из создателей этой технологии).
Поскольку трафик защищён https, то сниффером его не прослушаешь. Ребята из Applidium решили, что проще всего поднять поддельный https-сервер и dns-сервер — и посмотреть на запросы от Siri. Конечно, подделать настоящий сертификат guzzoni.apple.com не получится, но зато можно попробовать от имени собственного центра сертификации выдать на поддельный https-сервер собственный валидный сертификат на guzzoni.apple.com. Поскольку iPhone позволяет добавлять на телефон сертификаты от произвольных центров сертификации, то этот способ сработал — и теперь программа Siri может успешно обмениваться командами с вашим собственным сервером!
После этого хакеры смогли спокойно разобраться с протоколом Siri, в нём используются необычные методы, не соответствующие стандартам HTTP. Заголовок выглядит примерно так:
Как видим, используется метод ACE вместо обычного GET, в качестве url запрашивается “/ace”, поле Content-Length указано почти в 2 ГБ. Поле X-Ace-host как-то привязано к идентификатору устройства (GUID).
Само тело запроса отправляется в бинарном виде. Оно начинается с 0xAACCEE. Разработчики предположили, что дальше идёт заархивированный контент, то есть данные передаются в сжатом виде. Так оно и оказалось: архиватор zlib успешно распознал в бинарном коде архив (начиная с пятого байта после заголовка AACCEE).
В распакованных данных снова обнаружился двоичный код, но с включениями текста. Среди отдельных слов внимание разработчиков привлекло bplist00. Очевидно, это указание на бинарник plist. Изучив данные немного подробнее, разработчики обнаружили несколько различных фрагментов:
Разработчики выяснили, что Siri отправляет на сервер аудиофрагменты, сжатые кодеком Speex, а также повсеместно вставляет идентификатор устройства iPhone 4S. Программа и сервер обмениваются огромным количеством информации по малейшему поводу. Например, когда работает распознавание речи, серверы Apple присылают временные метки и «уровень доверия» для каждого слова.
Для самостоятельной работы с протоколом Siri можете использовать набор инструментов, созданный программистами Applidium.
Ключевым элементом Siri является то, как программа общается с сервером (Siri работает только при наличии доступа в интернет). Трафик идёт по протоколу TCP, порт 443, на сервер 17.174.4.4. Если вы попробуете связаться с сервером https://17.174.4.4/ с десктопа, то увидите, что он предъявляет сертификат на имя guzzoni.apple.com (Дидье Гуззони из компании SRI — один из создателей этой технологии).
Поскольку трафик защищён https, то сниффером его не прослушаешь. Ребята из Applidium решили, что проще всего поднять поддельный https-сервер и dns-сервер — и посмотреть на запросы от Siri. Конечно, подделать настоящий сертификат guzzoni.apple.com не получится, но зато можно попробовать от имени собственного центра сертификации выдать на поддельный https-сервер собственный валидный сертификат на guzzoni.apple.com. Поскольку iPhone позволяет добавлять на телефон сертификаты от произвольных центров сертификации, то этот способ сработал — и теперь программа Siri может успешно обмениваться командами с вашим собственным сервером!
После этого хакеры смогли спокойно разобраться с протоколом Siri, в нём используются необычные методы, не соответствующие стандартам HTTP. Заголовок выглядит примерно так:
ACE /ace HTTP/1.0
Host: guzzoni.apple.com
User-Agent: Assistant(iPhone/iPhone4,1; iPhone OS/5.0/9A334) Ace/1.0
Content-Length: 2000000000
X-Ace-Host: 4620a9aa-88f4-4ac1-a49d-e2012910921
Как видим, используется метод ACE вместо обычного GET, в качестве url запрашивается “/ace”, поле Content-Length указано почти в 2 ГБ. Поле X-Ace-host как-то привязано к идентификатору устройства (GUID).
Само тело запроса отправляется в бинарном виде. Оно начинается с 0xAACCEE. Разработчики предположили, что дальше идёт заархивированный контент, то есть данные передаются в сжатом виде. Так оно и оказалось: архиватор zlib успешно распознал в бинарном коде архив (начиная с пятого байта после заголовка AACCEE).
В распакованных данных снова обнаружился двоичный код, но с включениями текста. Среди отдельных слов внимание разработчиков привлекло bplist00. Очевидно, это указание на бинарник plist. Изучив данные немного подробнее, разработчики обнаружили несколько различных фрагментов:
- Фрагменты, начинающиеся с 0x020000xxxx — это пакеты “plist”, xxxx соответствует размеру бинарных данных plist, которые следуют за заголовком.
- Фрагменты, начинающиеся с 0x030000xxxx — пакеты “ping”, которые iPhone отправляет на сервер Siri, чтобы поддерживать соединение. Здесь xx соответствует порядковому номеру пинга.
- Фрагменты, начинающиеся с 0x040000xxxx — пакеты “pong”, которые сервер Siri отправляет на iPhone в ответ на пинги. Как несложно догадаться, xx соответствует порядковому номеру пакета.
Разработчики выяснили, что Siri отправляет на сервер аудиофрагменты, сжатые кодеком Speex, а также повсеместно вставляет идентификатор устройства iPhone 4S. Программа и сервер обмениваются огромным количеством информации по малейшему поводу. Например, когда работает распознавание речи, серверы Apple присылают временные метки и «уровень доверия» для каждого слова.
Для самостоятельной работы с протоколом Siri можете использовать набор инструментов, созданный программистами Applidium.