OWASP MASTG 最佳实践:Android 内部 IPC 必须使用显式 Intent(MASTG-BEST-0056)
文档教程网络安全【免费下载链接】mastgThe OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.项目地址https://gitcode.com/gh_mirrors/ow/mastg点击查看免费下载导读本文是 OWASP Mobile Application Security Testing GuideMASTG最佳实践 MASTG-BEST-0056 的深度解读当应用内部组件之间需要通信启动内部 Activity、调用内部 Service、发送应用内广播时必须使用显式 IntentExplicit Intent通过包名或组件类名直接锁定接收方杜绝第三方应用经由隐式 Intent 解析机制截获通信内容。读完本文你将掌握显式 Intent 的两种标准写法、隐式 Intent 的解析与劫持原理、Android 12/14 版本行为变更对内部通信的强制约束以及如何用 MASTG 仓库中的静态扫描规则、Demo 与测试用例验证你的应用是否合规。显式 Intent 与隐式 Intent两种截然不同的投递语义Android 的Intent是组件间通信的消息对象支持三种基本用途启动 Activity、启动 Service、投递广播。根据是否指名接收方Intent 分为两类详见 MASTG-KNOW-0025显式 IntentExplicit Intent直接指定接收方的应用包名或完整组件类名。因为目标唯一确定系统不再做任何匹配Intent 只会送达指定的组件。隐式 IntentImplicit Intent不指名任何组件只声明 action以及可选的 data、category由系统在已安装应用中解析匹配。// 显式调用方明确知道目标 Activity 类 Intent downloadIntent new Intent(this, DownloadActivity.class); downloadIntent.setAction(android.intent.action.GET_CONTENT); startActivityForResult(downloadIntent); // 隐式只声明 action由系统解析目标 Intent downloadIntent new Intent(); downloadIntent.setAction(android.intent.action.GET_CONTENT); startActivityForResult(downloadIntent);隐式 Intent 天然是为把任务委托给用户选定的外部应用而设计的打开网页、在地图上显示位置ACTION_VIEW、分享内容ACTION_SEND、请求文件ACTION_GET_CONTENT都是合理场景。问题恰恰出现在把应用内部通信也交给隐式机制的时候——这是 MASTG-BEST-0056 要解决的核心痛点。隐式解析机制为什么内部通信会被第三方截获当系统收到隐式 Intent 时会执行 Intent 解析Intent Resolution把它与所有已安装组件声明的intent-filter逐一比对。解析算法依次检查三类条件MASTG-KNOW-0025Actionfilter 必须声明与 Intent 相同的 action 字符串CategoryIntent 携带的所有 category 必须全部出现在 filter 中filter 可额外声明更多 categoryDataURI 的 scheme、host、path 以及 MIME type 必须满足 filter 中data的约束。解析结果存在三种情况只有一个匹配组件时系统直接投递有多个匹配组件时系统弹出 Chooser 选择器让用户挑选用户已设置默认处理器时可能不经用户决策直接投递。这意味着任何第三方应用只要在自己的清单里声明一个匹配的intent-filter就能成为该隐式 Intent 的合法候选接收方与目标应用内部组件的意图毫无关系。这种截获在 MASTG 中被称为 Intent 劫持Intent Hijacking对应的测试用例是 MASTG-TEST-0372内部通信使用隐式 Intent与 MASTG-TEST-0374隐式 Intent 携带敏感 extras两者均映射到 MASWE-0032 弱点族。攻击面的量化表述来自解析语义本身应用中只要存在一条内部通信却未指名接收方的投递点设备上每一个安装的应用就都是潜在接收者。MASTG 仓库用一对演示应用完整复现了这条攻击链受害者侧 MASTG-DEMO-0136应用意图启动内部InternalActivity却用setAction(org.owasp.mastestapp.INTERNAL_ACTION)发出隐式 Intent未指定包名或组件并携带了user_id、session_token两个 extras攻击者侧 MASTG-DEMO-0140一个攻击者应用仅为org.owasp.mastestapp.INTERNAL_ACTION声明了匹配的intent-filter就被系统列为该 Intent 的候选处理器。该应用本身并不恶意它只证明了任何应用都能为自定义 action 注册这一平台事实——真正的漏洞在受害者侧使用了隐式 Intent。受害者应用的清单如下AndroidManifest.xml!-- Internal activity with an intent-filter, making it a resolver candidate -- activity android:nameorg.owasp.mastestapp.InternalActivity android:exportedtrue intent-filter action android:nameorg.owasp.mastestapp.INTERNAL_ACTION / category android:nameandroid.intent.category.DEFAULT / /intent-filter /activityInternalActivity声明了 intent-filter于是它只是解析候选之一而不是唯一接收方。当系统弹出 Chooser 时攻击者应用出现在列表中一旦被或已被默认设置为选中受害应用的 action 与完整 extras 包含session_token就离开了自己的进程。正确做法让 Intent 显式化的两种标准写法MASTG-BEST-0056 给出了两种显式化手段按限制强度递增// 方式一按包名显式——把投递范围限制到自己的应用 val intent Intent(com.example.app.PROCESS_DATA).apply { setPackage(com.example.app) putExtra(key, value) } startActivity(intent) // 方式二按组件显式——最严格的形态 val intent Intent(context, TargetActivity::class.java).apply { putExtra(key, value) } startActivity(intent)**方式一Intent.setPackage**是包级作用域解析setPackage将解析范围限定在指定包内的组件同时仍按 action 匹配。MASTG-KNOW-0025 给出了它的等价写法val intent Intent(com.example.app.INTERNAL_ACTION).apply { setPackage(com.example.app) } startActivity(intent)**方式二Intent(context, Class::class.java)构造器**直接指定组件类名系统不做任何解析是内部通信最安全的形态。功能上等价于setClass/setClassName/setComponent后三者同样会为 Intent 绑定具体组件在 MASTG 的检测规则中与显式构造器并列视为已指名接收方。两条铁律总结如下内部通信一律显式启动本应用内的 Activity、Service 或投递应用内广播时使用组件显式构造器或setPackage而不是仅设置 action敏感数据绝不走隐式投递token、凭据、API Key 等任何敏感内容一旦放进隐式 Intent 的 extras就会被所有解析候选看到。敏感 extras 的泄露面从被截获到被读取隐式 Intent 的危险不止于投递错人还在于接收方拿到的是完整的 extras Bundle。MASTG-TEST-0374 专门检查引用隐式 Intent 携带敏感 extras的代码位置其评估结论为只要隐式 Intent 携带敏感或安全相关 extras且另一个应用能声明或注册匹配组件接收它们测试即失败。判定为敏感的 extras 包括凭据、会话 token、一次性验证码、个人数据、账户标识符、内部状态等——泄露后果可能是隐私泄露、会话失陷、账户接管或后端 API 被未授权调用。受害者 Demo 恰好示范了反面教材。MastgTest.kt 中第 13–21 行session_token与user_id被直接放进隐式 Intentval implicitIntent Intent().apply { action org.owasp.mastestapp.INTERNAL_ACTION putExtra(user_id, 12345) putExtra(session_token, abcde-fghij-12345) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } context.startActivity(implicitIntent)同一文件注释中给出了合规的替换方案Intent(context, InternalActivity::class.java)显式构造器加FLAG_ACTIVITY_NEW_TASK即可在保留全部 extras 的同时把投递范围锁死在本应用内。Manifest 配置把内部组件关起来显式 Intent 解决投递到哪的问题组件暴露解决谁能接收的问题两者必须配合。MASTG-BEST-0056 明确要求对内部组件务必确保它们没有无意间暴露给其他应用并指向 MASTG-BEST-0052 获取AndroidManifest.xml的完整加固指引。MASTG-BEST-0052 的核心主张是只在其他应用确实需要与组件交互时才导出组件默认私有以收缩攻击面。具体要点显式声明android:exported对清单声明的每个组件凡无需对外部应用开放者一律android:exportedfalse。不要依赖默认值——它在不同 Android 版本和组件类型间不一致且历史上只要组件带intent-filter就会被视为导出。自 Android 12API 31起任何带 intent-filter 的 Activity、Service 或 Broadcast Receiver必须显式声明android:exported否则无法安装。上下文注册的接收器使用带 flags 的registerReceiver()重载时显式传入RECEIVER_NOT_EXPORTED仅在必须接收外部广播时才用RECEIVER_EXPORTED。仅内部使用的组件移除 intent-filter如果组件只供本应用使用直接删除其intent-filter改用显式 Intent 访问这同时避免了 Android 12 导出声明的强制要求。必须导出时施加权限对外部可信应用开放的组件用android:permission搭配合适保护级别通常为signature的自定义权限。注意android:permission本身不够——normal或dangerous这类可宽泛授予的保护级别仍可能让不可信应用调用敏感组件权限保护级别详见 MASTG-KNOW-0017 体系。对上下文注册且须接收特定应用广播的接收器在broadcastPermission参数传入受信权限permission android:namecom.example.app.permission.SEND_INTERNAL_BROADCAST android:protectionLevelsignature /registerReceiver( myReceiver, IntentFilter(com.example.app.ACTION_INTERNAL), com.example.app.permission.SEND_INTERNAL_BROADCAST, null, Context.RECEIVER_EXPORTED )Android 平台的行为演进系统层面的强制MASTG-KNOW-0025 记录了一项关键的平台变更目标 SDK 为 Android 14API 34及更高版本的应用隐式 Intent 将永远不会被发送到内部组件。系统直接把内部组件从隐式解析中排除迫使开发者用显式 Intent 做内部通信否则应用在测试阶段就会功能失效。这意味着在最新目标版本上内部通信用隐式 Intent不仅是安全反模式而且直接是功能缺陷——MASTG-BEST-0056 给出的写法是这些应用能够正常工作的前置条件。验证与检测从静态扫描到动态嗅探的完整闭环MASTG 仓库围绕该最佳实践提供了从代码扫描到运行时验证的完整检测链路可用于评估自身应用是否合规。静态扫描semgrep 规则仓库提供现成的 semgrep 规则 mastg-android-implicit-intent-internal-communication.yml其核心逻辑是命中new Intent(...)setAction(...)startActivity(...)的投递模式同时排除三种已显式化的形态setPackage、setComponent、显式构造器new Intent(Context, Class)rules: - id: mastg-android-implicit-intent-internal-communication patterns: - pattern: | $INTENT new Intent(...); ... $INTENT.setAction($ACTION); ... $CONTEXT.startActivity($INTENT); - pattern-not: | $INTENT new Intent(...); ... $INTENT.setPackage(...); ... $CONTEXT.startActivity($INTENT); - pattern-not: | $INTENT new Intent(...); ... $INTENT.setComponent(...); ... $CONTEXT.startActivity($INTENT); - pattern-not: | $INTENT new Intent($CONTEXT, $CLASS); ... $CONTEXT.startActivity($INTENT); message: [MASVS-CODE-4] The app uses an implicit intent for internal component communication. Use explicit intents by specifying the package or component. languages: [java] severity: WARNINGDemo 中的 run.sh 展示了执行方式——对逆向产物直接跑规则NO_COLORtrue semgrep --config ../../../../rules/mastg-android-implicit-intent-internal-communication.yml MastgTest_reversed.java --text output.txt在受害者 Demo 上执行后output.txt 报告出 1 条代码定位new Intent()创建、setAction(org.owasp.mastestapp.INTERNAL_ACTION)、putExtra(user_id, ...)与putExtra(session_token, ...)、最终this.context.startActivity(implicitIntent)投递——恰好验证了 MASTG-TEST-0372 的失败条件用于应用内部通信的 Intent 是隐式的且另一个应用可以声明匹配组件接收它。同规则可一并检出 MASTG-TEST-0374 关心的敏感 extras 场景。静态到动态审查投递点上下文静态发现投递点后按 MASTG-TEST-0372 的进一步验证要求需要人工确认每个投递点的上下文Intent 是否有显式组件或包setPackage/setClass/setClassName/setComponent/ 显式构造器其他应用能否为同样的 action、data、category 声明或注册匹配的intent-filter对广播而言发送方是否要求了能阻止不可信接收方的权限该 Intent 是面向本应用组件/受信应用还是面向用户选择的第三方应用如ACTION_SEND分享流运行时验证嗅探隐式 Intent 与广播如果应用确实存在隐式投递MASTG-TECH-0164 提供了三层观察手段用于确认谁能收到、收到什么Activity Manager 广播历史只含 intent 元数据不含 extras 内容adb shell dumpsys activity broadcasts | grep actiondrozer 广播嗅探可打印完整 intent 含 extrasrun app.broadcast.sniff --action action典型输出可看到 extras 泄露Action: action Raw: Intent { actaction flg0x10 (has extras) } Extra: keyvalue (java.lang.String)方法 HookContext.sendBroadcast、Context.startActivity、BroadcastReceiver.onReceive当接收方受限或要求权限导致外部接收器无法观察时可在目标进程内部捕获完整 Intent 对象。结合 MASTG-DEMO-0140 的实操步骤安装受害者与攻击者应用、触发受害应用、在选择器中选中攻击者应用、从 logcat 提取被截获的 intent即可在真实设备上复现并取证内部通信被第三方读取的完整过程。总结MASTG-BEST-0056 是一条薄而硬的底线规则应用内部的一切 IPC 通信都必须显式指名接收方。它的技术依据来自 Android 隐式解析机制——任何声明匹配 intent-filter 的已安装应用都是隐式 Intent 的合法接收者它的落地手段包括Intent(context, Class)组件显式构造器与setPackage包级限定两种写法它与组件导出加固MASTG-BEST-0052互为表里共同保证内部数据不出应用进程而 Android 14 对内部组件隐式投递的系统级禁用则让这条实践从建议升级为必须。借助仓库中的 semgrep 规则、失败型 Demo、攻击型 Demo 与 嗅探技术任何安全测试团队都可以把这条最佳实践转化为可重复执行的检测用例。赞分享文档教程网络安全【免费下载链接】mastgThe OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.项目地址https://gitcode.com/gh_mirrors/ow/mastg点击查看免费下载相关推荐Warp 内存管理与跨设备访问实战指南从 Stream-Ordered 内存池到零拷贝Warp 内存管理与跨设备访问实战指南从 Stream Ordered 内存池到零拷贝 Warp 会自动管理普通数组分配的生命周期但分配在哪里、如何分配、文档教程网络安全MediaPipe 快速上手实时媒体处理从安装到跑通 Demo 的完整路径MediaPipe 快速上手实时媒体处理从安装到跑通 Demo 的完整路径 给视频通话加一个实时手势识别或让直播画面自动标记出人脸这类需求如果从零搭建光文档教程网络安全EverMem 插件 /evermem:ask 命令深度解析让 Claude Code 基于历史记忆与当前上下文回答过往工作问题EverMem 插件 /evermem:ask 命令深度解析让 Claude Code 基于历史记忆与当前上下文回答过往工作问题 导读 /evermem:as文档教程网络安全上一篇4个高效步骤让你彻底掌握LogExpert的日志分析与问题定位下一篇SLAM Toolbox终极指南从零开始掌握ROS 2D SLAM与终身建图创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

[RAG在LangChain中的实现-01]让LLM在指定的上下文范围内回答问题

[RAG在LangChain中的实现-01]让LLM在指定的上下文范围内回答问题

LLM具有两大的局限:一是它不知道自己不知道,所以我们发现它经常天马行空、一本正经地胡说八道,这就是所谓的幻觉;二是模型具有的知识在训练生成的那一刻就已经冻结,知识体系不会继续更替。RAG是目前针对这两个问题的主…

2026/10/5 10:14:51 阅读更多 →
5款AI写论文哪个好?一个正在被“合规拷问”改变的标准

5款AI写论文哪个好?一个正在被“合规拷问”改变的标准

云智变AI官网www.yunzhibian.cn 微信公众号搜一搜 云智变ai学术 “5款AI写论文哪个好”——这个问题在2026年有了一个新答案。 不是因为工具本身变了,而是因为评价标准变了。2026年,中国学位与研究生教育学会受教育部研究生司委托,正式发布…

2026/10/5 10:14:50 阅读更多 →
Zeroboot安全性深潜:硬件级隔离原理、熵重播种与4大已知限制全解析

Zeroboot安全性深潜:硬件级隔离原理、熵重播种与4大已知限制全解析

Zeroboot安全性深潜:硬件级隔离原理、熵重播种与4大已知限制全解析 【免费下载链接】zeroboot Sub-millisecond VM sandboxes for AI agents via copy-on-write forking 项目地址: https://gitcode.com/gh_mirrors/ze/zeroboot Zeroboot 是一款面向 AI Agent…

2026/10/5 10:13:50 阅读更多 →

最新新闻

Kimi K2 驱动 AI 文档阅读助手实战:零代码用 Claude Code 一天打造全栈文档管理网站

Kimi K2 驱动 AI 文档阅读助手实战:零代码用 Claude Code 一天打造全栈文档管理网站

文档教程知识库人工智能 【免费下载链接】ai-guide 程序员鱼皮的 AI 资源大全 Vibe Coding 零基础教程,分享 OpenClaw 保姆级教程、大模型玩法(DeepSeek / GPT / Gemini / Claude / GLM)、最新 AI 资讯、Prompt 提示词大全、AI 知识百科&…

2026/10/5 14:21:41 阅读更多 →
SAP物料账报错ML4HMASTER113与ML4HRUN053根因解析

SAP物料账报错ML4HMASTER113与ML4HRUN053根因解析

1. 项目概述:这不是一次简单的报错修复,而是一次对SAP物料账(Material Ledger)底层逻辑的深度体检“SAP-ML章<<<<第一节:物料账报错处理>>&#x…

2026/10/5 14:21:40 阅读更多 →
本科毕设遥感图像分类实战:72小时落地深度学习方案

本科毕设遥感图像分类实战:72小时落地深度学习方案

1. 这不是“速成课”,而是毕设场景下真正能落地的遥感图像分类实战路径 我带过三届毕业设计,每年四月总有一批学生抱着“毕设有救了”的心态冲进实验室,手里攥着刚下载的Sentinel-2数据、GitHub上抄来的PyTorch代码、还有导师一句“你试试用深…

2026/10/5 14:21:40 阅读更多 →
C++ STL:list 容器详解与模拟实现——从双向链表到反向迭代器

C++ STL:list 容器详解与模拟实现——从双向链表到反向迭代器

C STL:list 容器详解与模拟实现——从双向链表到反向迭代器 文章目录C STL:list 容器详解与模拟实现——从双向链表到反向迭代器1 list 的基本概念2 list 的构造2.1 构造空 list2.2 构造 n 个相同元素2.3 拷贝构造2.4 使用迭代器区间构造3 list 的迭代器…

2026/10/5 14:21:40 阅读更多 →
深入理解Spring Data:从JDBC样板代码到Repository自动化原理

深入理解Spring Data:从JDBC样板代码到Repository自动化原理

过去几年里,我带过不少刚入行的Java开发,大多数人第一次听到“Spring Data”这个词时,第一反应都是:这是个ORM框架吧?是不是跟MyBatis差不多?等真正接手项目,看到Service层里一个个接口注入、方…

2026/10/5 14:20:39 阅读更多 →
PHP短视频源码开发:JSON数据源统一接入与API适配层设计实践

PHP短视频源码开发:JSON数据源统一接入与API适配层设计实践

在做PHP开源短视频源码的时候,我遇到的第一件事不是播放器怎么接,也不是会员体系怎么做,而是第三方数据源的JSON格式乱到让人怀疑人生。短剧接口返回的字段和TVBox仓库对不上,TVBox仓库的结构和zyplayer视频源又不是一回事&#x…

2026/10/5 14:20:39 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →