90DaysOfDevOps 容器镜像扫描进阶:SBOM 软件物料清单、漏洞数据库与 CVSS v3 评分体系详解
文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载本篇是 90DaysOfDevOps 2023 路线第 15 天的深度解读对应仓库中的韩文文档 2023/ko/days/day15.md英文原版见 2023/day15.md。第 14 天我们学会了用 Grype、Trivy 等工具扫描容器镜像并发现 CVE本篇则深入扫描器的内部工作原理从 SBOM软件物料清单 Software Bill of Materials的生成到如何与漏洞数据库交叉比对再到 CVSS通用漏洞评分系统v3 的 8 个评分维度。读完后你将能够看懂syft输出的 SBOM 表格结构、理解漏洞数据库在依赖升级决策中的作用并掌握 CVSS 分数的构成逻辑为后续把镜像扫描嵌入 CI/CD 流水线2023/day21.md奠定理论基石。从扫描结果到扫描原理在 2023/day14.md韩文版 2023/ko/days/day14.md中我们已经知道容器镜像扫描的过程大致分为三步查看容器内部、获取已安装包列表包括 Linux 包以及 Java、Go、JavaScript 等语言特定包、将包列表与已知漏洞数据库交叉引用最终产出一份针对该镜像的漏洞列表。像 Grype、Trivy 这类工具之所以能给出16 个漏洞、167 个漏洞这样的结论背后依赖的正是本文要展开的三层机制SBOM先把镜像内的组件盘点出来漏洞数据库提供每个组件的已知漏洞情报CVSS对漏洞严重性给出可比较、可排序的量化分数。下面逐层深入。SBOM软件物料清单什么是 SBOMSBOM是SoftwareBillOfMaterials软件物料清单的缩写。它是构成一个软件应用或系统的全部组件的清单其中包含构建该软件所用的各种第三方库、框架以及其他开源或专有组件的信息。一份 SBOM 还可以包含这些组件的版本、许可证信息以及已知漏洞或安全问题的细节。SBOM 的目标是把这些组件逐项列出来让软件使用者对产品里到底装了什么拥有可见性从而避开那些出于安全或法律原因可能有害的组件。为什么近两年 SBOM 使用迅速普及文档指出在 2021、2022 年接连发生多起大规模供应链攻击之后SBOM 的使用变得更加普遍。供应链攻击的典型特点是漏洞藏在一个被大量项目间接依赖的组件里第 14 天提到的 Log4Shell/Log4j 就是典型案例单个应用自查往往发现不了问题必须从依赖清单层面入手才能定位风险。因此让每个软件制品都携带一份 SBOM成为供应链安全治理的基础动作。文档 Resources 部分还引用了 NIST 关于改善国家网络安全的行政命令相关页面说明 SBOM 的推广也带有政策驱动的背景。容器镜像语境下的 SBOM 包含什么在容器镜像的语境下一份镜像的 SBOM 至少包含两类内容容器内安装的Linux 包与库如 apt/dpkg 管理的.deb包为容器内运行的应用安装的语言特定包如 Python 包、Go 包等。前者描述的是基础操作系统层后者描述的是应用运行时层两者合在一起才能完整反映镜像的依赖构成。用 syft 提取镜像 SBOM 的实战有工具可以帮助我们从容器镜像中提取 SBOM其中一个代表就是syftAnchore 出品的开源工具与其漏洞扫描器 Grype 同属一个生态。例如用 syft 为ubuntu:latest容器镜像生成 SBOM只需一条命令$ syft ubuntu ✔ Parsed image ✔ Cataloged packages [101 packages] NAME VERSION TYPE adduser 3.118ubuntu5 deb apt 2.4.8 deb base-files 12ubuntu4.2 deb base-passwd 3.5.52build1 deb bash 5.1-6ubuntu1 deb bsdutils 1:2.37.2-4ubuntu3 deb coreutils 8.32-4.1ubuntu1 deb dash 0.5.11git20210903057cd650a4ed-3build1 deb debconf 1.5.79ubuntu1 deb debianutils 5.5-1ubuntu2 deb diffutils 1:3.8-0ubuntu2 deb dpkg 1.21.1ubuntu2.1 deb e2fsprogs 1.46.5-2ubuntu1.1 deb findutils 4.8.0-1ubuntu3 deb gcc-12-base 12.1.0-2ubuntu1~22.04 deb gpgv 2.2.27-3ubuntu2.1 deb grep 3.7-1build1 deb gzip 1.10-4ubuntu4.1 deb hostname 3.23ubuntu2 deb init-system-helpers 1.62 deb libacl1 2.3.1-1 deb libapt-pkg6.0 2.4.8 deb libattr1 1:2.5.1-1build1 deb libaudit-common 1:3.0.7-1build1 deb libaudit1 1:3.0.7-1build1 deb libblkid1 2.37.2-4ubuntu3 deb libbz2-1.0 1.0.8-5build1 deb libc-bin 2.35-0ubuntu3.1 deb libc6 2.35-0ubuntu3.1 deb libcap-ng0 0.7.9-2.2build3 deb libcap2 1:2.44-1build3 deb libcom-err2 1.46.5-2ubuntu1.1 deb libcrypt1 1:4.4.27-1 deb libdb5.3 5.3.28dfsg1-0.8ubuntu3 deb libdebconfclient0 0.261ubuntu1 deb libext2fs2 1.46.5-2ubuntu1.1 deb libffi8 3.4.2-4 deb libgcc-s1 12.1.0-2ubuntu1~22.04 deb libgcrypt20 1.9.4-3ubuntu3 deb libgmp10 2:6.2.1dfsg-3ubuntu1 deb libgnutls30 3.7.3-4ubuntu1.1 deb libgpg-error0 1.43-3 deb libgssapi-krb5-2 1.19.2-2 deb libhogweed6 3.7.3-1build2 deb libidn2-0 2.3.2-2build1 deb libk5crypto3 1.19.2-2 deb libkeyutils1 1.6.1-2ubuntu3 deb libkrb5-3 1.19.2-2 deb libkrb5support0 1.19.2-2 deb liblz4-1 1.9.3-2build2 deb liblzma5 5.2.5-2ubuntu1 deb libmount1 2.37.2-4ubuntu3 deb libncurses6 6.3-2 deb libncursesw6 6.3-2 deb libnettle8 3.7.3-1build2 deb libnsl2 1.3.0-2build2 deb libp11-kit0 0.24.0-6build1 deb libpam-modules 1.4.0-11ubuntu2 deb libpam-modules-bin 1.4.0-11ubuntu2 deb libpam-runtime 1.4.0-11ubuntu2 deb libpam0g 1.4.0-11ubuntu2 deb libpcre2-8-0 10.39-3ubuntu0.1 deb libpcre3 2:8.39-13ubuntu0.22.04.1 deb libprocps8 2:3.3.17-6ubuntu2 deb libseccomp2 2.5.3-2ubuntu2 deb libselinux1 3.3-1build2 deb libsemanage-common 3.3-1build2 deb libsemanage2 3.3-1build2 deb libsepol2 3.3-1build1 deb libsmartcols1 2.37.2-4ubuntu3 deb libss2 1.46.5-2ubuntu1.1 deb libssl3 3.0.2-0ubuntu1.7 deb libstdc6 12.1.0-2ubuntu1~22.04 deb libsystemd0 249.11-0ubuntu3.6 deb libtasn1-6 4.18.0-4build1 deb libtinfo6 6.3-2 deb libtirpc-common 1.3.2-2ubuntu0.1 deb libtirpc3 1.3.2-2ubuntu0.1 deb libudev1 249.11-0ubuntu3.6 deb libunistring2 1.0-1 deb libuuid1 2.37.2-4ubuntu3 deb libxxhash0 0.8.1-1 deb libzstd1 1.4.8dfsg-3build1 deb login 1:4.8.1-2ubuntu2 deb logsave 1.46.5-2ubuntu1.1 deb lsb-base 11.1.0ubuntu4 deb mawk 1.3.4.20200120-3 deb mount 2.37.2-4ubuntu3 deb ncurses-base 6.3-2 deb ncurses-bin 6.3-2 deb passwd 1:4.8.1-2ubuntu2 deb perl-base 5.34.0-3ubuntu1.1 deb procps 2:3.3.17-6ubuntu2 deb sed 4.8-1ubuntu2 deb sensible-utils 0.0.17 deb sysvinit-utils 3.01-1ubuntu1 deb tar 1.34dfsg-1build3 deb ubuntu-keyring 2021.03.26 deb usrmerge 25ubuntu2 deb util-linux 2.37.2-4ubuntu3 deb zlib1g 1:1.2.11.dfsg-2ubuntu9.2 deb从上面的输出可以看出SBOM 不仅列出了容器镜像内部安装的包与库还逐一列出了它们的类型TYPE与版本VERSION。例如bash的类型是deb、版本是5.1-6ubuntu1libc6的类型同样是deb、版本为2.35-0ubuntu3.1。这份名称 版本 类型的结构化清单正是下一步与漏洞数据库交叉引用的输入——我们可以用它逐项检查容器内是否存在已知漏洞。漏洞数据库什么是漏洞数据库漏洞数据库Vulnerability Database是关于软件、硬件及其他系统中已知漏洞的信息集合。它通常包含漏洞特征的细节例如漏洞的类型、漏洞的严重性、漏洞的潜在影响还可能包含漏洞可以被如何利用、以及针对该漏洞有哪些可用的补丁或修复方案等信息。文档中列举的漏洞数据库包括VulDB、NIST 的 NVD国家漏洞数据库、CVE Details 以及 Snyk 漏洞数据库等。这些机构通常提供可下载的 API 或原始数据我们可以用它们把 SBOM 中的包与漏洞信息进行交叉引用。交叉引用 SBOM 与漏洞数据交叉引用的方式很简单取 SBOM 中每个(包名, 版本, 类型)三元组去漏洞数据库里查询这个版本是否存在已知漏洞。这样就能发现我们的包中是否有需要关注的漏洞这正是第 14 天 Grype 输出结果表INSTALLED、FIXED-IN、VULNERABILITY、SEVERITY各列产生的底层原理。如何利用漏洞信息做升级决策在漏洞数据库中通常还可以找到两条对决策至关重要的信息该漏洞是在哪个库版本被引入的该漏洞是否在更新的版本中已被修复。借助这些信息我们可以决定是升级还是降级依赖来缓解漏洞。但正如 2023/day14.md 中已经强调的更新依赖并不总是简单直接因为升级常常伴随行为变化或 API 变更可能需要同步修改源码甚至引入新的问题。所以在做出升级/降级/保持不动的决策时需要把 CVSS 严重性、是否有修复版本、升级成本三者放在一起权衡。另外把这一过程规模化也是实战中的关键一步——第 21 天文档 2023/day21.md 展示了如何把 Grype 等扫描器配置进 CI/CD 流水线让每个构建产物在推送仓库前自动完成扫描与验证而不是由工程师手动逐个排查漏洞。漏洞的另一关键信息CVSS 分数除了有没有漏洞、在哪修复之外关于一个漏洞最重要的信息之一就是它的CVSS 分数——它回答的是这个漏洞到底有多严重、应该多紧急地处理。CVSS通用漏洞评分系统什么是 CVSSCVSS是CommonVulnerabilityScoringSystem通用漏洞评分系统的缩写。它提供一种方法用来捕捉漏洞的主要特征并产生一个反映其严重程度的数值分数。这个数值分数随后可以被转换为定性表达例如低、中、高、严重帮助组织恰当评估并排定漏洞管理流程的优先级。为什么需要 CVSS本质上一个漏洞可能比另一个漏洞更严重。我们需要一套能够客观地对漏洞排序的系统排序依据是这个漏洞有多容易被利用、一旦被利用能造成多大的损害。这正是 CVSS 存在的意义——把严重性从主观判断变成可比较的量化指标。CVSS v3 的 8 个评分基准CVSS v3 定义了 8 个用于计算 CVSS 分数的基准评估维度分别是攻击向量 Attack Vector反映漏洞可以被利用的上下文。可能的值Network网络N、Adjacent相邻A、Local本地L、Physical物理P攻击复杂度 Attack Complexity描述利用该漏洞所必须存在、但攻击者无法控制的条件。可能的值Low低L、High高H所需权限 Privileges Required描述攻击者在成功利用漏洞之前必须拥有的权限级别。可能的值None无N、Low低L、High高H用户交互 User Interaction指攻击者以外的用户是否需要参与才能使易受攻击的组件被成功攻陷。可能的值None无N、Required必需R范围 Scope指某个软件组件中的漏洞影响超出其自身资源或权限的能力。可能的值Unchanged不变U、Changed改变C机密性 Confidentiality指漏洞被成功利用后对软件组件所管理信息资源机密性的影响。可能的值None无N、Low低L、High高H完整性 Integrity指漏洞被成功利用后对完整性的影响。可能的值None无N、Low低L、High高H可用性 Availability指漏洞被成功利用后对受影响组件可用性的影响。可能的值None无N、Low低L、High高H分数如何合成这 8 个向量的组合决定了最终的 CVSS 分数。分数介于 0 到 10 之间0 是最低值10 是最高值最严重。每个漏洞的分数都可以通过 CVSS v3.0 计算器计算得出——把 8 个维度的取值逐个选好就能得到对应的数值分数及其定性等级Low/Medium/High/Critical从而为漏洞的优先级排序提供一致、可复现的依据。小结与下一步把本篇内容串起来就是一条完整的容器镜像安全扫描原理链SBOM负责回答镜像里装了什么——用 syft 等工具生成包含名称、版本、类型的组件清单漏洞数据库负责回答这些组件有什么已知问题——用 SBOM 与 NVD、Snyk 等数据库交叉比对找到漏洞、引入版本与修复版本CVSS负责回答这些问题有多严重、先处理哪个——用 8 个维度的向量合成 0~10 的分数并映射为低/中/高/严重等级。需要再次提醒的是延续第 14 天的结论这类扫描只能检测已知漏洞即已被安全研究人员发现并获得 CVE 编号的漏洞扫描结果为 0 也不代表 100% 安全同时漏洞缓解未必只是简单的版本升级可能伴随代码改动。理解了 SBOM、漏洞数据库与 CVSS 这三块基石后你就可以更自信地设计自己的镜像扫描流程或直接参考仓库中第 21 天 2023/day21.md 的 CI/CD 集成方案落地实践。作为本系列的下一站2023/day16.md韩文版 2023/ko/days/day16.md将探讨Fuzzing模糊测试——一种通过向程序输入无效、意外或随机数据来发现安全漏洞与缺陷的测试技术与本文的静态扫描视角互为补充。本文的完整出处为韩文文档 2023/ko/days/day15.md 与英文原版 2023/day15.md欢迎对照阅读原文继续深入。赞分享文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载相关推荐90DaysOfDevOps容器镜像扫描进阶 —— SBOM、漏洞数据库与 CVSS 评分体系详解90DaysOfDevOps容器镜像扫描进阶 —— SBOM、漏洞数据库与 CVSS 评分体系详解 本篇承接 Day 14 的容器镜像扫描基础深入剖析镜像扫文档/教程GraalVM Native Image 软件物料清单SBOM从构建期嵌入到漏洞扫描的完整实践GraalVM Native Image 软件物料清单SBOM从构建期嵌入到漏洞扫描的完整实践 GraalVM Native Image 在构建期自动为原编译器JIT编译语言运行时高性能计算内存管理ESP-IDF 软件物料清单SBOM生成与漏洞检测idf.py sbom-create / sbom-check 实战指南ESP IDF 软件物料清单SBOM生成与漏洞检测idf.py sbom create / sbom check 实战指南 导读 本文介绍 Espress物联网嵌入式上一篇老旧 Mac 免费升级最新 macOSOCLPOpenCore Legacy Patcher完整实操指南下一篇如何快速使用可视化元数据编辑器新手完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Nacos v3.1.1 Docker部署实战:版本选择、鉴权与持久化全解析

Nacos v3.1.1 Docker部署实战:版本选择、鉴权与持久化全解析

Nacos 这个名字在微服务项目里出现频率太高了,服务发现、配置管理多多少少都要跟它打交道。最近因为要给一个内部项目做升级评估,我在测试机上用 Docker 部署了一套 Nacos server v3.1.1。原本以为拉个镜像、跑个容器就能完事,真正操作下来才…

2026/10/9 2:24:32 阅读更多 →
Unison 点号语法解析错误深度剖析:从 fix-4536 转录测试看 UCM 错误报告机制

Unison 点号语法解析错误深度剖析:从 fix-4536 转录测试看 UCM 错误报告机制

编程语言编译器语言运行时开发工具 【免费下载链接】unison A friendly programming language from the future 项目地址: https://gitcode.com/gh_mirrors/un/unison 点击查看 免费下载 本篇文章围绕 Unison 代码仓库中的回归测试转录文件 fix-4536.md 展开&#…

2026/10/9 2:24:32 阅读更多 →
【附源码】用Spring AI统一接入所有MCP客户端,TaoToken 通道配置全解析

【附源码】用Spring AI统一接入所有MCP客户端,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/9 2:23:32 阅读更多 →

最新新闻

Java共享自习室系统实战:Spring Boot、MyBatis与座位并发管理

Java共享自习室系统实战:Spring Boot、MyBatis与座位并发管理

简介:基于Java的共享自习室系统是一份面向高校学生和Java初学者的毕业设计完整项目,聚焦自习室预约与资源管理,从用户注册登录、自习室信息维护、预约规则设计到提醒通知均有实现,覆盖需求分析、数据库设计、接口开发、前端交互和…

2026/10/9 3:01:51 阅读更多 →
IP改编剧本生成:深度思考模型提示词工程实战指南

IP改编剧本生成:深度思考模型提示词工程实战指南

简介:本资源是一份面向影视编剧、AI内容创作者及IP开发从业者的专业指南,聚焦深度思考模型(如DeepSeek)在文学、动漫、游戏等IP改编场景中的提示词工程实践。文档系统梳理了提示词设计原则、优化策略、自动化脚本开发、与剧本写作…

2026/10/9 3:01:51 阅读更多 →
Hermes Agent vs OpenClaw 深度对比:架构、记忆、安全与生态选型指南(TaoToken 视角)

Hermes Agent vs 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/9 3:01:51 阅读更多 →
Zed 编辑器:当你的光标会「读心术」,还养了一只猫当 UI 设计师——用 TaoToken 统一 Key 打通 Cursor 与 Zed 的 AI 补全

Zed 编辑器:当你的光标会「读心术」,还养了一只猫当 UI 设计师——用 TaoToken 统一 Key 打通 Cursor 与 Zed 的 AI 补全

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

2026/10/9 3:01:51 阅读更多 →
starrtc-web私有云部署:WebRTC信令与媒体链路实践

starrtc-web私有云部署:WebRTC信令与媒体链路实践

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

2026/10/9 3:01:51 阅读更多 →
DeepSeek+Coze AI获客智能体实战:从意图识别到工作流编排

DeepSeek+Coze AI获客智能体实战:从意图识别到工作流编排

简介:这份资源围绕DeepSeek与Coze组合,系统讲解从0到1搭建AI获客智能体的完整流程,面向传统行业中小老板、创业者与个人IP、销售运营人员,帮助解决短视频创作与获客难题。内容涵盖智能体定位与目标、业务流程梳理与痛点分析、场景…

2026/10/9 3:00:51 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

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/8 15:26:32 阅读更多 →
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/8 15:26:40 阅读更多 →
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/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/7 13:34:55 阅读更多 →