2026-04-22 · architecture / opensource
开源许可与版权工程
面向中国工程团队的开源许可、版权与合规系列。从 GPL、AGPL、Apache、木兰协议到中国真实案例、SCA/SBOM 工具链与出海合规,讲清楚开源在工程落地中的坑与方法。






















2018 年 8 月 15 日,红芯时代(北京)科技有限公司发布红芯浏览器企业版,并同步宣布完成由晨兴资本领投的 C 轮 2.5 亿元融资。官方宣传材料中多次出现”自主研发的中国芯”、“打破美国垄断”等表述,并声称产品基于”自主研发浏览器内核 RedCore”。
8 月 16
日凌晨,多名网友对安装包进行解压和分析,在安装目录下发现了
chrome.dll、chromium_version_info.h
以及版本字符串 49.0.2623.110。该版本对应
Chromium 2016
年前后的稳定版本。消息在微博、微信朋友圈和技术论坛迅速扩散,IT之家、36kr、虎嗅、钛媒体等媒体相继跟进报道(见参考资料
[3])。
8 月 17 日,红芯时代通过官方渠道发布《声明》,承认产品基于 Chromium 开发,但强调在企业应用层(SSO 集成、安全管控、国密算法支持)进行了大量创新,并表示此前的宣传措辞存在不当之处(见参考资料 [4])。
从法律角度看,红芯并未违反 Chromium 所使用的 BSD-3-Clause 开源协议——该协议允许以任何形式(含闭源商业产品)分发修改版。事件的核心争议在于商业宣传层面,而非开源合规层面。
Chromium 项目本身的主体代码采用 BSD-3-Clause 授权(也称三条款 BSD 许可证)。该协议对再分发的核心要求是:
Chromium 同时内嵌了大量第三方组件,这些组件有各自的许可证,包括 MIT、Apache 2.0、LGPL、MPL 等。在分发 Chromium 衍生品时,这些第三方组件的声明也必须随包附带。
红芯安装包中是否附带了完整的版权声明,公开信息中未见明确说明。但从协议角度,这是一个可以通过规范的合规流程解决的问题,而非根本性的违规。
红芯事件在舆论场上引发了巨大争议,但如果把讨论严格限定在”是否违反开源协议”这一层面,答案基本是否定的。要理解这一结论,必须先厘清 BSD-3-Clause 这一许可证的设计哲学及其与 GPL、MIT、Apache 2.0 等协议的关键差异。
BSD-3-Clause 的核心特征是允许”任何形式的再分发”,包括二进制形式、闭源形式乃至商业销售。协议文本中没有 Copyleft 条款(Copyleft 指要求衍生品也以相同许可证发布的条款,典型代表为 GPL)。这意味着:
这一设计是 BSD 家族协议的历史传统,可追溯至加州大学伯克利分校 20 世纪 80 年代 BSD UNIX 的发布策略。相比之下,GPL 从设计之初就强调”以许可证作为杠杆,迫使衍生作品同样开源”,两者的哲学差异根深蒂固。
对 Chromium 这类采用 BSD-3-Clause 的项目而言,下游团队可以对渲染引擎、JavaScript 引擎、网络栈做任何程度的修改,且:
这与 Linux 内核(GPLv2)的情况完全不同。Linux 内核的分发者必须向接受者提供获取”对应源码”(Corresponding Source)的途径,无论通过随盘附送、FTP 链接还是书面承诺。而 Chromium 的分发者没有这一义务。
BSD-3-Clause 的实际合规义务极其轻量,主要集中在”声明完整性”上:
chrome://credits
页面,列出所有第三方组件的许可证与版权声明。对红芯这类产品,理论上只要在”关于”对话框中保留了 Chromium 的版权声明与许可证文本,即满足协议的字面要求。在 2018 年的公开讨论中,并未出现红芯完全剥离所有版权声明的证据。
BSD-3-Clause 相对于 BSD-2-Clause 多出的”第三条款”是所谓”非背书条款”(Non-endorsement Clause),原文大意是:未经事先书面许可,组织或贡献者的名称不得用于为衍生产品做背书或推广。这一条款在工程实践中的含义常被忽略,但其实际边界包括:
第三条款本身是一条关于名誉权与商标法的约束,严格讲属于合同法范畴。违反非背书条款通常不会立即触发协议终止,但可能在商标诉讼或反不正当竞争案件中成为不利证据。
下表横向比较 BSD-3-Clause 与 MIT、Apache 2.0、GPL 在几个关键合规点上的差异(简表,仅作工程参考,不构成法律结论):
| 协议特性 | BSD-3-Clause | MIT | Apache 2.0 | GPLv2 | GPLv3 |
|---|---|---|---|---|---|
| 允许闭源分发 | 是 | 是 | 是 | 否(Copyleft) | 否(Copyleft) |
| 允许商业使用 | 是 | 是 | 是 | 是 | 是 |
| 须保留版权声明 | 是 | 是 | 是 | 是 | 是 |
| 须随附许可证全文 | 是 | 是 | 是 | 是 | 是 |
| 须披露衍生品源码 | 否 | 否 | 否 | 是 | 是 |
| 显式专利授权条款 | 无 | 无 | 有 | 隐含 | 有(更强) |
| 专利反诉终止条款 | 无 | 无 | 有 | 无 | 有 |
| 非背书条款 | 有 | 无 | 无(有商标条款) | 无 | 无 |
| 与 GPL 兼容性 | 兼容 | 兼容 | 与 GPLv3 兼容,与 GPLv2 不兼容 | — | — |
| Tivoization 限制 | 无 | 无 | 无 | 无 | 有 |
从表中可见,BSD-3-Clause 与 MIT 在授予接受者的自由度上几乎等价,两者均属于”高度宽松型”许可证。Apache 2.0 在宽松的基础上增加了专利授权和专利反诉终止,更适合商业场景下的大型项目(如 Kubernetes、Hadoop、Android AOSP 上层框架)。GPL 则是完全不同的哲学路线,以”源码可得性”为核心诉求。
回到红芯事件:从纯粹的协议角度,“基于 Chromium 换皮”是一个中性事实描述,并非违法行为,也不构成开源合规问题。类似的产品在全球大量存在,Microsoft Edge(基于 Chromium,2020 年切换)、Brave、Vivaldi、Opera(2013 年切换)等主流产品都可以被归入”基于 Chromium 的衍生品”。
真正的争议点在于:
工程团队在评估此类产品时,应将”协议合规”与”商业宣传诚信”两个维度分开讨论:前者是一个法律问题,后者是一个商业伦理与监管问题。
工程团队在评估一款浏览器产品时,可以通过以下多个层次的技术手段判断其是否基于 Chromium。
最直接的方法是访问特殊地址:
chrome://version
Chromium 内核内置了这个内部地址,会显示完整的版本号和构建信息。即使产品对 UI 进行了深度定制,这些内部页面通常仍然存在。常见的内部诊断地址包括:
chrome://version -- 内核版本、用户数据目录、命令行参数
chrome://flags -- 实验性功能开关
chrome://gpu -- GPU 信息与 WebGL 支持
chrome://net-internals -- 网络栈详情
chrome://components -- 内置组件版本
如果上述地址可以访问,基本可以确认内核为 Chromium(或基于 Blink/V8 的派生,如 CEF、Electron)。
Chromium 衍生浏览器即使修改了 UA 字符串,通常也会保留
Chrome/X.X.X
的部分,因为大量网站的服务端特性检测依赖于此。通过
JavaScript 访问 navigator.userAgent
或通过开发者工具的网络面板观察请求头,可以看到原始 UA。
典型格式如下:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
版本号 Chrome/49.0.2623.110
中,49 即主版本号,可以和 Chromium
的历史版本表对应(Chromium 49 于 2016 年 2 月到 3
月发布)。
Chromium 安装后产生的文件结构具有较强的特征性。关键文件和目录包括:
chrome.dll / libchrome.so -- 主体引擎库
chrome.exe / chrome -- 主进程
resources/ -- 资源包
locales/ -- 本地化文件(包含大量 .pak 文件)
Extensions/ -- 扩展目录
User Data/ -- 用户数据目录(Windows 路径结构)
chromium_version_info.h -- (源码目录中,标注版本信息)
CHROMIUM_BUILD -- (源码目录中的构建标记文件)
即便应用程序重命名了主可执行文件,chrome.dll
这一核心库文件的名称在历史版本中变化不大,是识别 Chromium
来源的有效指纹。
通过 strings
命令(Linux/macOS)或等效工具对主二进制文件进行字符串提取,通常可以找到大量
Chromium 特征字符串:
strings chrome.dll | grep -i chromium
strings chrome.dll | grep "Chromium [0-9]"
strings chrome.dll | grep "blink/"
strings chrome.dll | grep "v8/"典型输出示例(说明性,非实测):
Chromium 49.0.2623.110
blink/public/web/
v8/include/v8.h
chrome/browser/
src/third_party/WebKit/
Chromium 内核会向特定 Google 域名发出后台请求(Safe Browsing、Variations、Extensions 更新等)。即使产品关闭了部分服务,若内核未经深度改造,仍可能通过网络流量分析观察到这些特征请求。
对于能获取源码的项目,可以检查:
chrome/VERSION -- 版本号文件
build/util/LASTCHANGE -- 最后一次提交信息(指向 Chromium 仓库)
chromium_version_info.h -- 版本信息头文件
这些文件是 Chromium 构建系统自动生成的,在基于 Chromium 的项目中往往原样保留,除非团队有意删除。
前述方法主要依赖静态特征(文件、字符串、UA)。在更深入的鉴别场景下,可以通过运行时协议交互来获取更精细的指纹,其中最重要的是 Chrome DevTools Protocol(简称 CDP)以及 V8 引擎的内部版本信息。
Chromium 内核支持通过
--remote-debugging-port=9222(或任意端口)启动一个本地
HTTP + WebSocket 调试服务。所有未明确关闭该特性的 Chromium
衍生品,在加启动参数或修改配置后,通常都能暴露该接口。探测方法:
# 在启动命令行中加参数
/path/to/vendor-browser --remote-debugging-port=9222 --user-data-dir=./tmpprofile
# 探测元信息
curl http://127.0.0.1:9222/json/version
curl http://127.0.0.1:9222/json/list/json/version 返回的 JSON 中包含 Browser
字段(形如
Chrome/120.0.6099.71)、Protocol-Version、V8-Version、WebKit-Version、User-Agent
等字段,是判断底层 Chromium
版本最权威的来源之一。若产品声称”完全自研内核”,却能响应 CDP
/json/version 请求并返回
V8-Version,结论基本可以确定。
Runtime.evaluate 获取 V8 版本通过 CDP 的 WebSocket 通道下发
Runtime.evaluate,在页面上下文中执行 JavaScript
并回收结果:
{
"id": 1,
"method": "Runtime.evaluate",
"params": {
"expression": "JSON.stringify({ chrome: !!window.chrome, ua: navigator.userAgent })"
}
}V8 本身未直接暴露版本号给 JavaScript,但若进程可以通过
CDP 访问到 Debugger、Profiler
域,则可以进一步比对其方法签名与 V8
不同版本之间的差异。另外,许多 Chromium 构建会在
process.versions(Electron)或
chrome.runtime.getManifest()(扩展上下文)中直接暴露
V8 版本字符串。
chrome-extension:// URL Schema 与扩展生态Chromium 内置扩展系统遵循 Chrome Extensions Manifest(V2
/ V3)规范,其扩展页面使用
chrome-extension://<extension-id>/...
这一特定 URL Schema。判断方法:
.crx,或手动
load-unpacked);chrome-extension://...
访问扩展资源,则几乎可以确认其为 Chromium/Blink 派生;vendor-extension://),可进一步检查其扩展 API
命名空间是否仍暴露 chrome.*。少数 Chromium 衍生项目(如 Brave)会扩展或重写部分扩展
API,但核心 chrome.*
命名空间因兼容性原因基本保留。
Blink 与 V8 作为独立引擎,各自留有可在 JavaScript 层观察到的指纹:
-webkit- 与
-webkit-appearance 等属性在 Blink
中的行为细节与 Safari 的 WebKit
不完全相同,可通过测试已知行为差异(如
-webkit-line-clamp、overscroll-behavior
的具体回落行为)加以辨别;document.all 的
typeof 结果、InputEvent.inputType
的取值集合、ShadowRoot.innerHTML 的序列化细节在
Blink 与 Gecko/WebKit 之间存在可测差异;Function.prototype.toString
的输出格式、Error.stack
的栈帧格式、Symbol(@@toPrimitive)
的实现细节均具有 V8 指纹性;TypeError: Cannot read properties of undefined (reading 'x')
是 V8 较新版本的特定措辞,SpiderMonkey(Firefox)与
JavaScriptCore(Safari)输出的错误信息格式明显不同。实践中可以构造一组”指纹测试脚本”,批量触发上述差异点,在几秒内完成对渲染引擎/JS 引擎身份的推断。
navigator.userAgentData 与 Client Hints自 Chromium 89(2021 年)起,Chromium 引入了 User-Agent
Client Hints(UA-CH),并通过
navigator.userAgentData 暴露结构化字段:
navigator.userAgentData.getHighEntropyValues([
"architecture",
"model",
"platform",
"platformVersion",
"fullVersionList"
]).then(console.log);fullVersionList 中会列出
"Chromium"、"Google Chrome"
或厂商自定义品牌,并附带具体版本号。即便厂商试图在 UA
字符串中隐藏版本,这一结构化接口仍可能泄露实际内核版本。Firefox
与 Safari 均未实现
navigator.userAgentData,因此该接口存在本身就是一个强
Chromium 指纹。
下表汇总了前文出现的各类识别方法,按取证强度排序,供工程团队在合规审计或选型时使用:
| # | 方法 | 取证强度 | 对抗成本(厂商隐藏难度) | 适用阶段 |
|---|---|---|---|---|
| 1 | chrome://version 可访问 |
极强 | 低 | 初步筛查 |
| 2 | chrome://credits 可访问 |
强 | 低 | 合规审计 |
| 3 | chrome://flags /
net-internals |
强 | 中 | 深度确认 |
| 4 | UA 中保留 Chrome/x.y.z |
中 | 低 | 被动观察 |
| 5 | navigator.userAgentData 存在 |
强 | 中 | 运行时探测 |
| 6 | CDP /json/version 响应 |
极强 | 中 | 运行时取证 |
| 7 | chrome-extension:// URL Schema |
强 | 高 | 扩展加载测试 |
| 8 | Blink CSS/DOM 行为指纹 | 中 | 高 | 自动化测试 |
| 9 | V8 Error.stack 格式 |
中 | 高 | JS 探针 |
| 10 | 文件名 chrome.dll /
libchrome.so |
中 | 中 | 静态扫描 |
| 11 | strings 提取
Chromium X.Y.Z.W |
强 | 中 | 静态扫描 |
| 12 | 后台请求 Google 域名 | 中 | 高 | 网络抓包 |
| 13 | 源码 LASTCHANGE 指向 Chromium Git |
极强 | 低(若能获取源码) | 源码审计 |
实践中,任意两条以上的强证据组合即可得出可靠结论。反之,若产品通过了全部 13 项且均未露出 Chromium 痕迹,则其”非 Chromium 内核”的声明可以获得初步支持(但仍不能排除是 WebKit/Gecko/自研的其他可能)。
BSD-3-Clause(也写作 Modified BSD License、New BSD License)是一份极为宽松的许可证。对于商业产品(含闭源分发)的核心要求:
| 要求 | 详细说明 |
|---|---|
| 保留版权声明 | 源码和二进制分发均须包含原始版权声明 |
| 保留许可证声明 | 须包含完整许可证文本或相应声明 |
| 非背书条款 | 不得使用项目名称或贡献者名称为衍生品做背书 |
| 无 Copyleft 要求 | 不要求开放修改后的源码 |
| 无专利条款 | BSD-3 本身不含专利授权条款(与 Apache 2.0 不同) |
对于 Chromium 衍生产品,合规的最小操作是:
LICENSE
文件;LICENSE 文件中包含 Chromium
的版权声明及第三方组件的声明(Chromium 提供了完整的
LICENSE 汇总文件);Chromium 包含超过 100
个第三方依赖,各自有不同的许可证。Chromium 仓库在
third_party/ 目录下维护了每个依赖的
README.chromium
文件,记录了名称、URL、版本、许可证类型和许可证文件路径。Chromium
官方提供了汇总脚本和生成工具来自动化这一过程。
对于基于 Chromium 的商业产品,建议通过以下工具辅助合规审查:
# 生成 Chromium 的许可证汇总(在 Chromium 源码目录中)
python tools/licenses/licenses.py credits > ABOUT_CREDITS.html该命令生成的 ABOUT_CREDITS.html 是 Chrome
浏览器自身在 chrome://credits
页面展示的内容,包含所有第三方组件的声明。基于 Chromium
的产品应当以某种形式保留并展示这些声明。
BSD-3-Clause 第三条(非背书条款)的实践含义:
除 BSD-3-Clause 文本本身的约束外,Google 针对 Chrome/Chromium 品牌与视觉元素另外发布了商标使用指引。工程团队在命名、包装衍生产品时,应同时遵守以下几点:
chrome://version)保留 Chromium
字样是允许的,因为这是技术实现层面的标识,不构成品牌使用;Chromium 作为一个浏览器项目,涉及多项音视频编解码标准:
Google 发布的 Chrome 浏览器对 H.264/H.265/AAC 的支持,是由 Google 向 MPEG LA 统一支付专利许可费的结果。基于 Chromium 的衍生产品在默认启用这些编解码器时,并不自动继承 Google 的专利许可。工程团队在分发前应:
在每一次对外发版前,基于 Chromium 的产品应当至少完成以下检查:
[ ] LICENSE 文件已包含 Chromium BSD-3-Clause 原文
[ ] chrome://credits 或等效页面可访问并内容完整
[ ] 第三方组件许可证清单与 SBOM 一致
[ ] 专有编解码器(H.264/H.265/AAC)授权已落实,或已关闭
[ ] Widevine DRM 授权已落实,或已关闭
[ ] 产品名称与图标不涉及 Chrome/Chromium 商标侵权
[ ] 宣传文案经法务审阅,未暗示 Google 官方背书
[ ] 安全补丁对齐至上游 Chromium 最近三个版本以内
[ ] 内部诊断页(chrome://version)展示的基础版本与 SBOM 一致
Checklist 本身应作为 CI/发布流水线的阻塞项,不通过不得发版。
在红芯事件后,国产浏览器的”内核来源”透明度问题引发了更广泛的讨论。以下是几类典型情况的梳理(信息来源:各厂商公开文档和公开报道):
基于 Chromium 的国产浏览器:360 安全浏览器、QQ 浏览器、搜狗浏览器、猎豹浏览器等主流产品均明确基于 Chromium(或早期的 Webkit)。这些产品在宣传上通常不声称”自主内核”,合规层面争议较小。
声称自研内核的产品:需要从技术层面区分”基于标准构建自研渲染引擎”(如 Firefox 的 Gecko、Safari 的 WebKit 起源)与”基于 Chromium 源码大幅定制”两种情况。
政府采购合规场景:国家标准和政府采购要求中对”自主可控”有特定界定。工程团队在评估此类产品时,应以官方测评机构的评测结论为准,而非单纯依赖厂商自我描述。
深度操作系统(Deepin,现统信 UOS 的社区版)基于 Debian GNU/Linux。Debian 作为上游,其发行版管理遵循严格的 DFSG(Debian 自由软件指导方针)。
协议结构: - Linux 内核:GPLv2(Kernel syscall exception 适用,用户态程序不受 Copyleft 传染) - GNU 工具链(bash、coreutils 等):GPLv3 - 桌面环境 DDE(Deepin Desktop Environment):GPLv3,源码在 GitHub 公开 - 深度应用(深度文件管理器、深度终端等):GPLv3,源码在 GitHub 公开 - 部分商业应用(WPS、微信 Linux 版等):商业许可,不在发行版 GPL 组件范畴内
从 GPL 合规角度,Deepin/UOS 作为 Debian
衍生版,其开源组件的源码可通过官方 apt 源或 GitHub
仓库(github.com/linuxdeepin)获取,满足
GPLv2/GPLv3 的”对应源码提供”要求。
统信 UOS 的商业版本将部分企业功能以闭源方式实现,但这些功能与 GPL 组件的边界处理是否完全合规,需要结合具体版本和具体组件分析。统信软件(深度科技的商业主体)公开表示遵循相关开源协议。
麒麟操作系统存在两个独立品牌:银河麒麟(Kylin)由天津麒麟信息技术(原国防科大麒麟系统)主导,中标麒麟由中标软件(北京)主导,两者于 2019 年合并为麒麟软件有限公司。
麒麟(Kylin)基于 Ubuntu LTS 的衍生版本,内核为 Linux,桌面环境 UKUI 以 GPL 许可证在 GitHub 公开。麒麟软件在政府合规和等保测评方面通过了相关认证,其 GPL 组件的合规性可通过官方软件源核实。
中科曙光的曙光 Empyrean Linux 基于 CentOS/Red Hat 衍生路线,其 GPL 合规实践与通用 RHEL 衍生版基本一致。
openEuler(华为 2019 年开源,2021 年捐赠给开放原子开源基金会)基于 CentOS 7 演化,内核为 Linux。openEuler 在 Gitee 上完整公开源码,满足 GPL 的源码可获取要求。作为捐赠给开放原子基金会的项目,其治理架构和许可证合规性受到基金会规范约束。
深度操作系统(Deepin)是中国大陆投入最持久、知名度最高的桌面 Linux 发行版之一。其商业主体从”武汉深之度科技”演化为”统信软件(UnionTech)“,产品形态也从面向个人的 Deepin 扩展为面向政企信创市场的 UOS(Uniontech OS)。在十余年的发展历程中,Deepin 曾经经历过一次关键的上游切换:从基于 Ubuntu 转为直接基于 Debian。这一切换的工程动机、技术代价与合规收益,对于任何计划构建”本土化 Linux 发行版”的团队都有参考价值。
Deepin 项目最早可追溯至 2004 年前后的 Hiweed Linux(基于 Debian),其由刘文欢等人发起,目标是打造一款”对中文用户友好的桌面 Linux”。2008 年前后,项目更名为 Linux Deepin,核心策略调整为基于 Ubuntu LTS 构建,以获取 Ubuntu 相对成熟的桌面体验和硬件兼容性。
这一阶段的典型特征:
采用 Ubuntu 作为上游的好处显而易见——Ubuntu 拥有更完善的硬件驱动(尤其是显卡与无线网卡)、更及时的商业驱动打包、更稳定的用户社区。对于一个资源有限的中小团队,“踩在 Ubuntu 肩膀上”比直接对接 Debian 要省力很多。
从 2014 年底到 2015 年,Deepin 逐步完成了从 Ubuntu 到 Debian 的基线切换。这一决策背后是一系列工程和合规因素的综合考量。
Ubuntu 在 2010–2015 年前后主导了两项在社区中颇具争议的技术:
此外还有 Upstart(init 系统,最终被 systemd 取代)、部分 Canonical 自研的云/容器工具等。这些组件带来了三个问题:
Debian 社区以 DFSG(Debian Free Software
Guidelines,Debian 自由软件指导方针)为选包基准,将软件分为
main、contrib、non-free、non-free-firmware
四个区:
main 区内的所有软件必须满足 DFSG
的九条标准,保证”无附加限制的再分发”;contrib 与 non-free
区只作为可选提供,不构成默认系统的一部分;main 区的包都有明确的许可证出处。对以政企采购为目标市场的 Deepin/UOS 而言,上游选择 Debian 意味着更易于构建完整的开源合规链条:每一个包的来源、协议、补丁都可以向 Debian 追溯,无须处理 Ubuntu 引入的 Canonical 专有组件的授权复杂性。
Ubuntu 本身基于 Debian。一个典型的 Ubuntu
衍生版,其软件包路径是
Debian unstable → Debian testing → Ubuntu → Ubuntu Deepin,中间经过两到三次
rebase 与打包调整。直接基于 Debian 后:
切换到 Debian 为直接上游后,统信 UOS 在 GPL 合规层面具备了更清晰的链路。其主要合规机制包括:
统信软件运营官方源码镜像(以实际官网信息为准):
https://mirrors.uniontech.com/uos/
该镜像站通常同时提供:
deb 仓库,供 apt
使用);deb-src 仓库,供
apt-get source <package> 使用);对 GPLv2/v3 组件而言,“提供对应源码”的义务可以通过”在用户可访问的网络地址上持续提供源码”来满足。源码镜像站的长期可用性是 GPL 合规的关键抓手。
在 Debian 打包体系下,每一个二进制 .deb
包都对应一个源码包(.dsc +
.orig.tar.* +
.debian.tar.*)。用户可以用一条命令获取任意已安装包的原始源码:
# 在 sources.list 中启用 deb-src 源后
apt-get source <package-name>
# 获取包含构建脚本的完整源码树
apt-get source --compile <package-name>这一机制相比”用户需要发邮件向厂商索要源码”的做法,合规性显著更强,也显著减少了运营成本。
UOS 有桌面社区版(Deepin)与商业版(UOS Desktop / UOS Server)两条线。二者在 GPL 合规上的处理原则是:
这一模式与 Red Hat 的”RHEL 订阅制”有一定相似性:代码本身开源,商业价值来自发行版的集成、测试、认证与支持服务。
麒麟操作系统的历史比 Deepin 更为复杂,涉及军工科研、国企改制与多个品牌合并。
“麒麟”(Kylin)最早是国防科技大学(国防科大)主导的自研操作系统研究项目,时间约为 2001 年前后。早期版本”银河麒麟”面向军工与高性能计算场景,内核曾经尝试过 FreeBSD 路线,后切换为 Linux 内核。这一时期的目标用户主要是军工、国防、科研院所,商业化程度较低。
与国防科大路线并行的,是”中标软件”(原”上海中标软件”、“北京中标软件”)运营的 NeoKylin(中标麒麟)。中标软件的 NeoKylin 基于 Red Hat / CentOS 路线,在政府 OA、电力、金融办公场景中占有相当份额。
2019 年,天津麒麟(银河麒麟主体)与中标软件合并,成立新的”麒麟软件有限公司”,两条产品线整合为”银河麒麟 V10”(面向党政军与信创)与”中标麒麟”(保留原有兼容性产品线)。合并后的麒麟软件成为中国电子信息产业集团(CEC)旗下的重要子公司。
麒麟的桌面环境 UKUI(Ubuntu Kylin User Interface)是基于 Qt 构建的自研桌面,代码托管在 GitHub 的 ukui 组织下,采用 GPL 许可证。组件包括 ukui-panel、ukui-menu、peony(文件管理器)、kylin-video(视频播放器)等。
UKUI 最早出现于 Ubuntu Kylin 发行版(Canonical 官方认可的中文衍生版),后被麒麟软件继承并作为银河麒麟 V10 的默认桌面。UKUI 的 GPL 合规性可以通过 GitHub 公开仓库直接验证。
中科方德软件股份有限公司(NFSChina,简称”方德”)的操作系统产品”方德桌面操作系统”与”方德服务器操作系统”走的是 CentOS/RHEL 衍生路线,这与 Deepin/麒麟(Debian/Ubuntu 系)形成对比。
主要背景:
从协议合规角度,方德作为 RHEL 衍生路线的厂商,继承了 RHEL
的 GPL 合规框架:srpms
源码包可以从官方源或镜像站获取,GPL
组件满足”源码可得”要求。
红旗 Linux 是中国大陆最早具备广泛知名度的商业 Linux 发行版之一,其历史有几个关键节点:
红旗 Linux 的兴衰对后来者的启示是:单纯依靠国产化政策红利而缺乏可持续商业模式与技术纵深的发行版难以长期存续。Deepin/UOS 与麒麟软件在商业化与技术投入两方面的持续投入,是其今天能够在信创市场立足的关键。
综合上述历史经验,一个计划构建本土化 Linux 发行版的团队,在选择上游基线时通常面临以下权衡:
| 基线选择 | 优势 | 劣势 | 典型代表 |
|---|---|---|---|
| Debian | DFSG 严格、维护周期长、无商业附加条款 | 硬件驱动适配稍慢、打包周期较长 | Deepin / UOS |
| Ubuntu LTS | 硬件兼容性好、驱动生态完善 | 受 Canonical 商业决策影响、存在专有组件 | 早期 Deepin、Ubuntu Kylin |
| RHEL / CentOS Stream | 企业级稳定性、SELinux 与国密集成成熟 | 生态更偏服务器、桌面体验一般 | 方德、红旗、龙蜥、openEuler |
| Fedora | 上游最新、创新性强 | 生命周期短(约 13 个月) | 科研与开发用途 |
| Arch / 自组包仓 | 完全自主控制 | 维护成本极高 | 极少数技术型团队 |
没有”最好的”基线,只有”最适合你团队能力与市场定位”的基线。
在”基于开源二次开发”这一光谱上,还存在另一个更深层的选择:对于自己做出的改动,是推动合入上游(upstream-first),还是保留在自己的 fork 中长期维护(downstream patch)。这一选择对工程团队的长期成本、安全态势与合规风险都有显著影响。
upstream-first(上游优先)是一种工程文化,核心原则是:任何对开源项目的修改,如果具备通用价值,应优先尝试提交到上游;只有在上游明确拒绝或不适合通用化的修改,才保留为本地补丁。
这一策略的典型实践:
对于企业而言,upstream-first 的长期收益包括:减少本地补丁维护成本、降低安全补丁回溯复杂度、提升在开源社区中的技术影响力、改善招聘品牌。
相反,长期维护大量 downstream patch 会积累以下问题:
| 维度 | 上游贡献 | 下游魔改 |
|---|---|---|
| 首次投入 | 高(需走社区流程、多轮 review) | 低(直接改代码) |
| 长期维护 | 低(上游帮你维护) | 高(每次 rebase 都要重新 adapt) |
| 安全响应 | 自动继承上游补丁 | 需手动评估与合并 |
| 合规复杂度 | 低(上游的许可证框架) | 高(每个补丁都要审计) |
| 技术影响力 | 提升团队/公司技术品牌 | 仅内部可见 |
| 人才吸引力 | 显著(工程师愿意做有社区可见度的工作) | 一般 |
| 商标/IP 风险 | 低(上游项目授权明确) | 中(改动可能触及他人 IP) |
| 可替代性风险 | 低(实现已在上游) | 高(绑定当前团队的本地知识) |
把 upstream-first 作为开源合规的”主动防御”手段,意味着:
华为对 Linux 内核的贡献是一个典型案例。自 2010 年代中期以来,华为在 arm64 架构支持、调度器优化(如 CFS、EAS 相关补丁)、内核调试能力、文件系统等方向向 Linux 内核提交了大量补丁,近年来稳居 Linux 内核贡献者排行榜前列。这种上游贡献模式相比”直接 fork 一个华为内核并长期维护”的代价,差异是数量级的。
相对应的,企业可以在内部建立”upstream liaison”职能:由经验丰富的工程师专职负责与上游社区的沟通、补丁提交、冲突协调,把”合入上游”作为绩效目标。
Signed-off-by:
行声明”本提交由我原创或我有权提交”。Linux 内核、Kubernetes
等大量项目采用 DCO;企业在内部建立对应的流程:
对于任何一次”我要不要改一下这个开源组件”的决策,建议采用以下决策树:
(1) 这个改动是否能通用化(对其他用户也有价值)?
是 → 进入 (2)
否 → 作为本地补丁保留,严格控制范围
(2) 上游社区对这类改动的接受度如何?
欢迎 → 走 upstream-first 流程
保守 → 先发 RFC 试水,再决策
明确拒绝 → 考虑替代方案(独立项目 / 插件机制)
(3) 是否涉及商标、专利、商业秘密?
否 → 继续 upstream
是 → 法务评估后决定;必要时替换为等价非商密实现
(4) 安全补丁是否必须自己先落地?
否 → 等上游节奏
是 → 本地打补丁 + 同步向上游提交,标记为"pending upstream"
(5) 改动是否影响 API/ABI?
否 → 直接 upstream
是 → 先与上游沟通兼容性策略,再提交
这一决策树的核心价值在于:把”改还是不改、怎么改”从个人偏好升级为团队级的工程治理。长期来看,这直接决定了一家企业在开源生态中是”消费者”还是”共建者”。
红芯事件暴露了一个长期存在于技术宣传领域的模糊地带——“自主研发”究竟意味着什么?从工程和协议角度,可以区分以下三个层次:
层次一:从零自主研发(Greenfield)
完全由团队自行设计、实现的核心引擎,不依赖上游开源项目的代码库。典型例子:Mozilla 从 Netscape 代码库演化的 Gecko 渲染引擎,WebKit 最初由 Apple 基于 KHTML 开发并重构。
在浏览器内核领域,从零研发一个现代化的渲染引擎(支持 HTML5、CSS Grid、JavaScript JIT 等)需要数百工程师年的投入,几乎没有新进入者能独立完成。
层次二:基于开源进行实质性二次开发
以开源项目为基础,在核心逻辑上进行大量修改和扩展。典型例子:三星的 Tizen 浏览器引擎(基于 WebKit 进行大幅改造)、中国移动的自研 AI 能力集成到 Chromium 框架。
这一层次的判断标准:修改的代码量占核心功能的比例,以及是否存在明确的技术差异化。
层次三:最小修改换皮(Rebranding)
在开源项目基础上进行最小化修改(更换 UI 皮肤、修改默认主页、添加书签)后以新品牌发布。大多数”定制浏览器”属于这一层次,这在协议上完全合法,但在宣传上不应声称”自主研发内核”。
对于工程和产品团队,建议建立以下内部基线:
| 实际情况 | 可以说 | 不建议说 |
|---|---|---|
| 基于 Chromium 换皮,UI 改动 | “基于 Chromium 的企业定制浏览器” | “自主研发浏览器内核” |
| 基于 Chromium,增加了安全沙箱、国密 | “基于 Chromium 并集成自研安全模块” | “中国自主可控浏览器内核” |
| 基于 Linux 内核,开发了驱动和桌面 | “基于 Linux 内核的操作系统” | “完全自主的操作系统内核” |
| 基于 Android AOSP,定制 ROM | “基于 Android 开源项目的定制系统” | “自主研发移动操作系统” |
这些边界不仅是开源合规的要求,也是商业诚信和防范消费者保护风险的基本规范。
在中国政府采购和关键信息基础设施保护场景下,“自主可控”有官方测评路径:
工程团队在进入政府采购流程时,应以信创目录的入选条件为准,而非依赖自我宣传。
Chromium 每隔 4 周发布一个主版本,安全补丁频率更高。基于 Chromium 的衍生产品如果无法跟上上游的安全更新节奏,会积累大量已知 CVE(Common Vulnerabilities and Exposures,公共漏洞和暴露)。
红芯使用的 Chromium 49(2016 年)版本,距离 2018 年发布时已经两年以上,期间积累了数十个已公开的严重漏洞(CVSS 评分 7.0 以上的高危漏洞多达数十个)。这是”换皮浏览器”在安全上的核心风险,也是企业用户评估此类产品时最需要关注的技术指标。
工程建议:在评估浏览器产品的安全性时,应要求厂商提供当前基础版本(Base version),并对比该版本与最新 Chromium 稳定版之间的 CVE 差距。
许多基于 Chromium
的产品忽略了附带完整的第三方组件声明(ABOUT_CREDITS.html
或等效文件)。这是 BSD-3-Clause
的明确要求,缺失可能构成协议违反。
检查方法:在浏览器地址栏中输入
chrome://credits,查看是否存在该页面及完整的声明内容。
Chromium 的商标政策明确规定:Google 的”Chrome”和”Chromium”商标不得用于衍生产品的品牌命名,也不得暗示产品是 Google 的官方产品或受到 Google 支持。使用”Chromium”作为产品名或核心宣传词可能构成商标侵权。
Chromium 主体代码虽然是
BSD-3,但其部分第三方依赖(如历史版本中的某些 libav/ffmpeg
组件)使用了 LGPL 或 GPL
协议。如果产品以静态链接方式集成了这些组件,根据 GPL/LGPL
的条款可能产生相应的源码开放义务。建议对 Chromium 的
third_party/ 目录进行系统性协议扫描。
基于 Chromium 的衍生产品如果未修改浏览器指纹相关逻辑(如 Canvas fingerprint、WebGL fingerprint、AudioContext fingerprint),其用户在访问互联网时会被识别为普通 Chrome 用户。这在多数场景下不构成问题,但在以下情境下需要关注:
Chromium 的构建系统基于 GN(Generate Ninja)+ Ninja,与传统的 Makefile/CMake 差异较大。团队在接手 Chromium 源码后,若缺乏对 GN 语法的掌握,常见问题包括:
args.gn
配置与官方文档的最佳实践不一致,导致构建产物膨胀或性能下降;is_debug、is_component_build、symbol_level
等关键参数理解不够,最终版本体积与性能严重偏离目标。解决方法是在团队内沉淀《Chromium 构建指南》,并将关键参数固化在 CI 脚本中,而非依赖个别工程师的经验。
chrome://version
页面确认基础版本,评估已知高危漏洞敞口;chrome://credits)。LICENSE 和
CREDITS 的自动化生成流程,避免发版时遗漏;| 产品 | 上游基础 | GPL 合规路径 | 适用场景 |
|---|---|---|---|
| 深度 Deepin / 统信 UOS | Debian | GitHub 源码公开 | 桌面办公、政企信创 |
| 麒麟 Kylin | Ubuntu LTS | GitHub 源码公开(UKUI 等) | 政府、军工信创 |
| openEuler | CentOS 7 演化 | Gitee 完整源码 | 服务器、云基础设施 |
| 龙蜥 Anolis OS | CentOS 7/8 兼容 | GitHub 源码公开 | 云原生、互联网 |
对组织的首席安全官而言,红芯事件揭示的核心风险不是”厂商撒谎”,而是”组织在选型时缺乏技术验证能力”。建议的行动框架:
无论厂商如何宣传,对任何拟引入的浏览器、操作系统、中间件都强制执行技术验证:
对每一个拟引入的组件,计算”CVE 暴露面”:
暴露面 = (上游最新版本) - (产品声称基础版本)
= 两者之间的 CVE 数量(按 CVSS 评分加权)
制定组织内部的红线(例如:高危 CVE 未修复数量不得超过 5 个,或版本滞后不得超过 12 个月)。红线之外的产品原则上不得引入生产环境。
在合同中明确要求:
组织内部建立对”自主可控”、“国产化”、“完全自研”等营销用语的解读规范:
涉及关键信息基础设施的组织,其安全选型结果可能被监管机构(如网信办、工信部、行业主管部门)核查。CISO 应确保:
开源合规工程师(Open Source Program Office,OSPO;或法务团队的技术接口人)的职责在于把前文讨论的协议框架落实为可操作流程。以下是实操清单:
THIRDPARTYNOTICES.txt、CREDITS.html、或
chrome://credits 等效页面;本文为工程参考,不构成法律意见。涉及具体法律风险请咨询专业法律顾问。本文所述事件均来自公开报道与公开判决书,如有偏差以官方渠道为准。
上一篇:文档、数据、模型的许可:CC、ODbL、OpenRAIL、LLaMA 协议
下一篇:CentOS 停服与生态重组:Rocky、Alma、openEuler、龙蜥
把当前热点继续串成多页阅读,而不是停在单篇消费。
2026-04-22 · architecture / opensource
面向中国工程团队的开源许可、版权与合规系列。从 GPL、AGPL、Apache、木兰协议到中国真实案例、SCA/SBOM 工具链与出海合规,讲清楚开源在工程落地中的坑与方法。
2026-04-22 · architecture / opensource
数字天堂 vs 柚子科技(2019)、不乱买案(2018)、罗盒 vs 玩友(2019–2020)——这批中国 GPL 诉讼案件厘清了 GPL 作为合同在中国法律框架下的效力,以及违反 GPL 的法律后果。本文梳理案件脉络、判决核心争议与工程合规启示。
2026-04-22 · architecture / opensource
深入解析 GPLv2 到 GPLv3 的条款变化、Tivoization 反规避与 DRM 条款、专利终止条款;LGPL 链接例外的工程边界;以及 Linus Torvalds 拒绝升级到 v3 的真实原因与嵌入式生态影响。包含路由器厂商、国内 Android 设备的 GPL 合规真实案例。
2026-04-22 · architecture / opensource
从 TODO Group 定义出发,拆解 OSPO 的职责矩阵、中国大厂实践(华为、阿里、腾讯、字节跳动)、最小可行 OSPO 模型与成熟度路径,给出不同规模企业的落地方案。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。