一个研发为了赶进度,从开源社区引入一个图像处理组件,编译进产品,对外销售。两年后收到律师函:该组件采用传染型许可证,要求衍生作品同样开源。
这不是个案。多数企业对开源的态度是「能用就用」,直到出事才发现,免费的东西有代价。
一、三类许可证的实质差别
第一类,宽松型。要求保留版权声明与免责声明,衍生作品可以闭源。商业友好,风险最低。
第二类,弱传染型。允许闭源,但修改了组件本身的部分,修改部分要开源;以动态链接方式调用的,通常不触发。
第三类,强传染型。只要与组件结合成一个整体作品并分发,整体都要按同一许可证开源。商业软件用了它,等于放弃闭源。
三类的判断不看组件大小,看许可证条款。一个几百行的工具库,也可能采用强传染型许可证。
还有一类更特殊:网络服务型许可证。它把「分发」扩展到了「通过网络提供服务」,即使不分发软件,只要对外提供在线服务,也要开源。做云服务的尤其要注意。
二、五种典型风险
第一种,传染风险。强传染型组件进入产品,导致整个产品被迫开源。
第二种,兼容性风险。两个不同许可证的组件结合,条款互相冲突,任何一个都无法遵守。
第三种,声明缺失风险。宽松型许可证要求保留版权声明,企业在打包时删掉了声明文件。
第四种,专利风险。部分许可证含专利授权条款与报复性终止条款,一旦企业对许可证持有方发起专利诉讼,授权自动终止。
第五种,版本风险。组件升级后许可证变更,从宽松型改为传染型,企业未跟踪,继续使用新版本。
五种里,第一种后果最重,第五种最隐蔽。
三、政策该写哪六条
第一条,准入清单。把常见许可证分为允许、限制、禁止三级。允许的直接用;限制的需法务审批;禁止的一律不得引入。
第二条,审批流程。研发引入新组件前提交申请,说明组件名称、版本、许可证、使用方式(链接还是修改)、分发方式。
第三条,使用方式约束。强传染型组件只能用于内部工具,不得编译进对外销售的产品;确需使用的,采取进程隔离等规避方式。
第四条,声明保留。产品发布时附带开源声明文件,列明组件名称、版本、许可证、版权声明。
第五条,组件清单管理。建立组件清单,记录每个组件的来源、版本、许可证、引入时间、责任人。
第六条,退出机制。组件许可证变更或者出现安全漏洞时,如何评估、替换、通知客户。
六条里,第五条是基础。没有清单,前面五条都落不了地。
四、组件清单与扫描怎么做
组件清单要覆盖三层:直接引入的组件、组件依赖的间接组件、构建工具与运行时环境。
间接依赖最容易被漏。一个组件可能依赖十几个上游库,其中某个采用传染型许可证,风险照样传导过来。
扫描工具分两类:一类扫描源代码,识别引入的开源片段;一类扫描二进制产物,识别打包进去的组件与版本。
两类要结合用。源代码扫描能发现复制粘贴的片段,二进制扫描能发现实际发布的内容。
扫描频率建议:每次版本发布前必扫;组件升级后必扫;每季度做一次全量扫描。
扫描结果要有人看。生成一份报告没人处理,等于没扫。
五、出问题后的补救
四步。
第一步,评估范围。确认涉事组件进入了哪些产品、哪些版本、分发给了哪些客户。
第二步,判断性质。是修改了组件代码,还是仅动态链接;是内部分发,还是对外销售。性质不同,义务不同。
第三步,选择方案。可选方案包括:替换组件、隔离使用(独立进程调用)、按许可证开源相应部分、取得商业授权。
第四步,通知与整改。涉及已交付客户的,评估是否需要通知、是否需要对客户进行补偿。
四步里,第三步最花钱。替换组件要重写、要测试、要重新验证,周期往往以月计。
还有一条:如果对方已经发函,不要拖。多数许可证的终止条款规定,违反后若干日内不纠正,授权自动终止,此后的使用构成侵权。
六、一个被迫重构的案例
某软件企业的产品中集成了一款开源的数据可视化组件,用于生成图表。该组件采用强传染型许可证。
企业的使用方式是:把组件源码复制到自己的代码库,修改了配色与部分渲染逻辑,编译进产品,以闭源方式销售。
三年后,组件原作者委托律师发函,要求企业按许可证开源整个产品,或者停止使用并赔偿。
企业评估了三个方案:开源整个产品,等于放弃核心代码,不可行;取得商业授权,对方报价按年销售额的百分之八,每年约四百万元;替换组件,需要重写渲染引擎与部分交互逻辑。
最终选择替换。投入四名工程师,历时七个月,重写约六万行代码,测试与回归验证又用两个月。直接成本约二百八十万元,产品延期发布导致的机会损失未计入。
事后复盘三点。第一,引入时没有人看许可证,研发只关心「能不能跑通」;第二,产品打包时删掉了许可证文件,连声明都没保留;第三,三年间组件升级了十一个版本,没有人跟踪许可证是否变更。
整改后,企业建立了组件准入清单与发布前扫描流程,组件清单纳入法务备案。
七、研发人员最需要知道的三句话
第一句:引入前先看许可证,不看代码多少行。一个小工具也可能有传染性。
第二句:修改开源代码要留记录。改了哪几个文件、改了什么,将来判断义务范围时用得上。
第三句:不要把开源代码复制进自己的代码库。复制会让边界消失,链接还能说清,复制说不清。
三句话讲清楚,比发一份三十页的制度有效。制度是给法务看的,这三句是给写代码的人看的。
八、开源合规清单
- 已建立许可证准入清单,分允许、限制、禁止三级
- 引入新组件前提交申请,法务审批
- 记录组件的来源、版本、许可证、使用方式
- 组件清单覆盖直接依赖与间接依赖
- 发布前做源代码与二进制双向扫描
- 产品附带开源声明文件,保留版权声明
- 强传染型组件仅用于内部工具,不进入对外产品
- 跟踪组件升级后的许可证变更
- 建立漏洞与许可证变更的应急替换机制
- 研发培训覆盖三句核心要求,年度复训
开源不是免费,是用自由换约束。用了别人的代码,就要接受别人的规则。规则写在许可证里,只是没人读。