tg生态观察 ٭✡️⚝✹✸✶✷✴️✧⊛🔯❂⍣≛✨🇻🇳
才不要管你们什么币圈/翻墙圈/主机圈/中文圈/广告圈/XX圈. 这圈那圈, 圈你妹 转载/贴链接的消息仅表示原作者观点 (即无情的转载机器) 接受投稿: [at]tgsucksbot 投稿者可注明是否需要匿名,若无要求则默认视为不匿名 匿名来稿会标注匿名来稿,以此区分频道管理员的 亲自原创 亲自转发
Show more- Subscribers
- Post coverage
- ER - engagement ratio
Data loading in progress...
Data loading in progress...
Subscribe to our new Telegram channel:
https://t.me/TuckerCarlsonNetworkThe social media app Telegram has over 900 million users around the world. Its founder Pavel Durov sat down with us at his offices in Dubai for a rare interview. Watch more here:
https://bit.ly/3RCq6ccSubscribe to the new Tucker Carlson Network channel for more exclusive content:
https://www.youtube.com/@TCNetwork/featured?sub_confirmation=1Follow Tucker on X:
https://x.com/TuckerCarlsonText “TUCKER” to 44055 for exclusive updates. #TuckerCarlson #Telegram #PavelDurov #censorship #freespeech #FBI #CIA #news #politics #NSA #ElonMusk #JanuarySix #California
The founder of Telegram, which has nearly a billion users, planned to HQ the company in San Francisco until he got attacked walking its streets:
Subscribe to our new Telegram channel:
https://t.me/TuckerCarlsonNetworkThe social media app Telegram has over 900 million users around the world. Its founder Pavel Durov sat down with us at his offices in Dubai for a rare interview. Watch more here:
https://bit.ly/3RCq6ccSubscribe to the new Tucker Carlson Network channel for more exclusive content:
https://www.youtube.com/@TCNetwork/featured?sub_confirmation=1Follow Tucker on X:
https://x.com/TuckerCarlsonText “TUCKER” to 44055 for exclusive updates. #TuckerCarlson #Telegram #PavelDurov #censorship #freespeech #FBI #CIA #news #politics #NSA #ElonMusk #JanuarySix #California
TL;DR: HTTP Bot API 是建构于 tdlib 之上的,是对 Telegram 服务端的 API (MTProto API) 的非常高层次的封装。我想知道盲目轻信 Content-Type 标头的 MIME 这一漏洞是直接出现在服务端,还是先出现在 HTTP Bot API、tdlib,然后再传递到服务端的。通过分析前两者的源代码,我认为是直接出现在服务端的。与此同时,直接经由 MTProto API 上传文件是可以手动指定 MIME 的,这可能是另一种漏洞利用的方式,同时也意味着后一种利用链条可能只是未被发掘。然而我认为客户端在这个漏洞里的责任更大。HTTP Bot API 并不是 Telegram 服务端最终暴露的 API,后者是 MTProto API。HTTP Bot API 只有机器人(bot)可使用,普通用户不能使用;而 MTProto API 既可以被 bot 使用,也可以被普通用户使用。前者开放源代码,任何人均可自行搭建。后者则只有 schema 提供。 进一步地,HTTP Bot API 其实是对 tdlib 的一个 HTTP 封装,同时提供许多便利方法;而 tdlib 又是对 MTProto API 的一个保姆级封装,覆盖了建构一个客户端所需的方方面面。被引用的这条分析里涉及的就是前面说的「便利方法」sendVideo。其关键在于对
Client::get_input_file
这个方法的调用。注解如下:
td::Status Client::process_send_video_query(PromisedQueryPtr &query) {
auto video = get_input_file(query.get(), "video");
// 略
}
td_api::object_ptr<td_api::InputFile> Client::get_input_file(const Query *query, td::Slice field_name,
bool force_file) const {
// 重载。query->arg(field_name) 实际上获取了请求参数 video 的值
return get_input_file(query, field_name, query->arg(field_name), force_file);
}
td_api::object_ptr<td_api::InputFile> Client::get_input_file(const Query *query, td::Slice field_name,
td::Slice file_id, bool force_file) const {
// 由于重载,通过 file_id 传入了请求参数 video 的值。
// video 的取值可参见 https://core.telegram.org/bots/api#sending-files
if (!file_id.empty()) {
// 本地模式,私有部署可用
if (parameters_->local_mode_) {
// 本地文件
td::Slice file_protocol{"file:/"};
if (td::begins_with(file_id, file_protocol)) {
return make_object<td_api::inputFileLocal>(get_local_file_path(file_id.substr(file_protocol.size())));
}
}
// bot 上传的文件
td::Slice attach_protocol{"attach://"};
if (td::begins_with(file_id, attach_protocol)) {
field_name = file_id.substr(attach_protocol.size());
// 传入了 URL 或 file_id
} else {
// force_file 表示强制将多媒体文件作为普通文件发送,sendVideo 一定导致传递 false,从而条件为真
if (!force_file) {
// 取得 URL 或 file_id,以后将会传递给 tdlib,最终传递给服务端
// 如果是 URL,由服务端自行下载 URL;如果是 file_id,服务端查询对应于 file_id 的服务端文件
// 引用的分析(sendVideo 传入远程 URL)会是这种情况
return make_object<td_api::inputFileRemote>(file_id.str());
}
}
}
// 执行到这里意味着这是 bot 上传的文件,或者 bot 传入了 force_file=true
auto file = query->file(field_name);
if (file != nullptr) {
// 取得本地的临时文件名,以后将会传递给 tdlib,最终上传到服务端
return make_object<td_api::inputFileLocal>(file->temp_file_name);
}
return nullptr;
}
经过一段复杂的调用链(从略)后,进入了 tdlib 内部。随后关键调用链如下:MessagesManager::send_message -> MessagesManager::do_send_message -> get_input_media_impl -> VideosManager::get_input_media。最后一步构造了一个 inputMediaDocumentExternal 实例,它最终将经由 MTProto API 传递给服务端。
tl_object_ptr<telegram_api::InputMedia> VideosManager::get_input_media(/* 略 */) const {
// 略
if (file_view.has_url()) {
// 略
return make_tl_object<telegram_api::inputMediaDocumentExternal>(flags, false /*ignored*/, file_view.url(), ttl);
}
// 略
}
该类型专门用于指示 Telegram 服务端从互联网上的 URL 下载文件。因此引用的分析中展示的漏洞如果真实存在的话,那么应当是服务端自己盲目轻信了 Content-Type 标头导致的漏洞,而不是产生了形如「服务端 -> tdlib -> HTTP Bot API -> Content-Type 标头」这样的盲目轻信链。
然而,如果使用 MTProto API,则直接上传的文件其实也是可以手动指定 MIME 的。MTProto API 将文件上传划分为两个阶段:上传、提供文件属性,分别对应 InputFile 和 inputMediaUploadedDocument 。后者有一个赫然的 mime_type
字段。在该字段提供不匹配的 MIME 理论上也是一条漏洞利用的路径,同时也意味着上述的「盲目轻信链」有可能存在于别处。
不过,服务端对文件的元数据其实表现出很矛盾的处理方式,在我过往的试验中,即使该等文件是通过传递 URL 令服务端到互联网上拉取的,它仍会解析文件以确定分辨率、时长等元数据并返回给客户端。如果客户端上传文件,随意指定的元数据也会被服务端检测到并修正,这点在 tdlib 的源代码中也有所体现。不过,服务端的检测能力并不完美,即使是常见如 .mov
容器,它也常常失能于属性检测而依赖客户端提供正确的属性(是的,大部分客户端也会在上传文件时解析元数据并传送给服务端),否则转为普通文件。无论如何,其实 Telegram 服务端对媒体文件还是有着更多离谱的服务端限制的,我已经踩过很多坑了,因此这个漏洞在这个背景下就显得比较低级错误了。不过我认为更大程度上应该归咎于客户端:客户端自己也盲目轻信了服务端,没有做到时刻谨慎行事。
Disclaimer: 我没有进行实际调试以验证被引用的分析和我的猜想各自的正确性,也没有对 inputMediaUploadedDocument 是否任意接受 mime_type
进行试验。上述结论是基于粗略的代码审计及我长久以来使用 MTProto API 的经验(尤其是我在业余项目 RSS-to-Telegram-Bot 中大量使用 inputMedia*External 的经验)得出的,未必完全正确。读者如果进行了试验,可以在评论区留言,我会跟进更新。结论:疑似攻击者通过利用错误MIME type实现客户端欺骗。 涉及Telegram中的两个API功能——sendVideo和InputFile。 sendVideo中的video字段支持两种输入方式,“InputFile or String”, - (String)传递一个文件 ID(以字符串形式)来发送存储在 Telegram 服务器上的视频(推荐做法) - (String/InputFile)传递一个 HTTP URL(以字符串形式)以便 Telegram 从互联网获取视频 - (InputFile)使用 multipart/form-data 上传一个新视频。 问题出在第二种,InputFile - Sending by URL时,目标资源可以拥有一个自定义的MIME标签,以指示其他Telegram客户端应该以什么方式加载这个资源。 而这些不怀好意的.pyzw文件,(可能由于漏洞)在这里都被指定为了video/mp4,导致其他Telegram客户端将以播放器模式展示这个文件。 响应标头:>图1< 请求方json: { "dcId": number, "location": { "_": "inputDocumentFileLocation", "id": "*", "access_hash": "*", "file_reference": [ *, *, *, * ] }, "size": 42, "mimeType": "video/mp4", "fileName": "***.pyzw" } 另外,Telegram Desktop的影片播放方式决定了Telegram Desktop将会把这些较小的视讯资源放置在本地下载目录,然后通过“执行”的方式来加载本地影片至内嵌播放器,这也就是为什么在用户点击这些“假影片”后会自动执行攻击者编写的代码。
一个类似的漏洞已经被确认,目前 Telegram Desktop 尚未发布包含修复的新版本,再次建议用户不要轻易点击陌生人发送的消息文件
https://t.me/Rosmontis_Daily/4631