软件源代码非公知性司法鉴定方法探析
2018-07-30刘玉琴
刘玉琴,桂 婕
(1.北京印刷学院 绿色印刷包装产业技术研究院,北京102600;2.工业和信息化部软件与集成电路促进中心知识产权司法鉴定所,北京 100038;3.中国科学技术信息研究所,北京 100038)
由于以主张著作权进行软件知识产权民事诉讼的时间周期较长,越来越多的软件企业在知识产权遭到侵犯时,采取以侵犯商业秘密为由的刑事诉讼,以此对侵权人形成心理威慑,达到快速阻止侵权的目的。在此过程中,作为商业秘密关键要素的软件非公知性(不为公众所知悉)成为诉讼的先决条件之一。在此背景下,软件非公知性鉴定案件数量骤然增多,其中最主要的是针对软件源代码的非公知性鉴定。由于软件技术复杂和鉴定人知识有限,使得软件非公知性鉴定相对于同一性鉴定具有更大操作难度。本文从软件源代码非公知性鉴定的法律依据入手,分析影响源代码非公知性的最主要的8项因素,进而提出司法鉴定人进行软件源代码非公知性鉴定的流程。同时,论文探讨了作为软件算法或核心技术的源代码非公知性鉴定思路。
1 软件源代码非公知性鉴定的背景与法律依据
非公知性鉴定源于商业秘密诉讼。《反不正当竞争法》《刑法》《关于禁止侵犯商业秘密行为的若干规定(修正)》中均提及商业秘密的概念。按照《反不正当竞争法》的规定,商业秘密是指不为公众所知悉、能为权利人带来经济利益、具有实用性并经权利人采取保密措施的技术信息和经营信息。由此可以看出,构成商业秘密的要件有:非公知性、价值性(经济价值和实用价值)、保密性。诉讼过程中价值性和保密性由法官判断,非公知性的判断则需要具有专业技术知识的司法鉴定人进行判断。软件源代码的技术特性显著,非公知性的判断自然成为司法鉴定的鉴定对象。
目前,针对软件源代码的非公知性鉴定学术研究较少。相关学术研究一是集中在软件知识产权司法鉴定的相关概念、原则、方法等理论层面的探讨[1-4]。二是集中在针对软件产品同一性或相似性鉴定技术层面的研究[5-8]。而在司法鉴定实践中,很难从正面直接判断一个技术信息具有非公知性,鉴定实务中多是采用排除法进行鉴定。
对于有关技术信息的非公知性判断,我国《最高人民法院关于审理不正当竞争民事案件应用法律若干问题的解释》第九条规定:“有关信息不为其所属领域的相关人员普遍知悉和容易获得,应当认定为反不正当竞争法第十条第三款规定的 ‘不为公众所知悉’。具有下列情形之一的,可以认定有关信息不构成不为公众所知悉:(1)该信息为其所属技术或者经济领域的人的一般常识或者行业惯例;(2)该信息仅涉及产品的尺寸、结构、材料、部件的简单组合等内容,进入市场后相关公众通过观察产品即可直接获得;(3)该信息已经在公开出版物或者其他媒体上公开披露;(4)该信息已通过公开的报告会、展览等方式公开;(5)该信息从其他公开渠道可以获得;(6)该信息无须付出一定的代价而容易获得。”
鉴定实务中多通过对上面列举情形进行一一排除,最终给出鉴定意见。为此,本文结合软件源代码的具体特征,对上面列出的情形进行进一步细化,分析影响源代码非公知性的主要因素,提出应对措施,建立鉴定思路。
2 软件源代码非公知性鉴定的方法探析
2.1 影响源代码非公知性的技术因素分析
在建立源代码非公知性鉴定思路之前,笔者首先结合软件源代码的技术特征分析总结影响源代码非公知性的技术因素,具体归纳为以下8项主要因素。
2.1.1 通过反编译可以获得的源代码
一些高级计算机语言编写的软件程序,在没有对目标程序进行加密或混淆技术处理情况下,很容易通过目标程序反编译得到其对应的源代码,而且反编译得到的源代码与生成目标程序的原始源代码相似程度较高、可读性较强,是影响源代码非公知性的一个重要因素。目前,常见的软件源代码非公性鉴定中,由C、C++、VB等语言编写的软件程序不容易被反编译;由JAVA、.NET平台下的编程语言(如C#VB.NETC++.NETF#.NET)编写的软件程序容易被反编译;由Delphi设计的软件程序中窗体代码容易被反编译,而逻辑代码不容易被反编译。
在对源代码进行非公知性鉴定时,如果能够通过反编译得到源代码,一般认为其具有公知性。但有两种情况除外,一是软件销售时对目标程序采用了加密或混淆的技术方式阻止反编译的实施,二是无法获得目标代码,即无法获得反编译的对象。如,在软件销售时与客户签订保密协议限制客户向非授权用户进行软件目标程序的复制,从而使其他非授权用户很难获得目标程序,也就难以获得反编译的对象;又如,目标代码存在的方式比较复杂,无法通过简单的方法从销售的产品中获取目标代码,也就难以获得反编译的对象。
2.1.2 B/S架构下浏览器可获得的源代码
随着互联网技术的发展,B/S(Browser/Server,浏览器/服务器)架构的软件程序已经成为主要的软件应用模式。在这种架构下,用户工作界面通过浏览器来实现,主要业务逻辑都在服务器端实现,极少部分业务逻辑在浏览器端实现。对于源代码来说,一部分在服务器端经过编译以后成为目标码,在服务器端运行;一部分没有经过编译的脚本,由客户端浏览器运行。比如,用C#或Java设计的B/S系统,服务器端运行C#或Java目标程序,而用于进行页面显示控制或简单业务逻辑实现的JAVASCRIPT脚本、CSS样式单、HTML页面、图片等都是由客户端的浏览器来运行和显示的。对于客户端来说,这些脚本、样式单、网页和图片是可获得的。如果基于B/S架构的程序面向公众用户,那么运行于浏览器端的各种源代码具有公知性。
在司法鉴定中,根据程序开发和运行环境判断程序是否为B/S架构,再结合程序面向的用户,判断源代码是否具有非公知性。
2.1.3 自动生成的源代码
计算机自动生成的源代码,是指非程序编写人员直接编写的源代码,而是采用一些辅助的软件工具得到的源代码。其非公知性不能简单地通过代码本身去判断,需要结合代码自动生成的条件综合考虑。典型的自动生成的源代码包括集成开发环境(Integrated Development Environment,IDE)自动生成的窗体代码,基于数据库结构的代码生成器自动生成的数据库操作源代码,基于UML统一建模语言生成的源代码,以及通过语言转化工具转化的其他编程语言源代码。
IDE自动生成的窗体源代码。比如,采用.NET平台下的编程语言、Delphi语言、VB6.0语言进行窗体程序的开发,这类程序的窗体布局代码,大多是程序设计人员将设计好的控件“拖”到窗体后由集成开发环境自动生成。除非特别复杂的控件布局,其他程序设计人员是可以通过观察程序运行效果对其界面进行模仿,得到相同或相似窗体代码。这类窗体代码除与业务功能源代码混合外,在司法鉴定实践中不宜鉴定为具有非公知性。
基于数据库结构的代码生成器自动生成的数据库操作源代码。目前,Java和C#语言的代码生成器较多,其中一些代码生成器根据数据库结构设计自动生成数据库操作相关的源代码。应用比较普遍的代码生成器包括动软代码生成器[9]、CodeSmith[10]、MyGeneration[11]等。比如,动软代码生成器根据数据库结构设计生成数据层、业务层C#源代码。对于这类源代码的非公知性鉴定,本质上是由生成这些源代码的输入条件-数据库结构-决定的。因此,司法鉴定过程中这类源代码的非公知性,本质上是由数据库结构的非公知性决定的。
基于UML统一建模语言生成的源代码。在面向对象应用程序开发不断发展的时代,UML不仅支持面向对象的分析和设计,而且可以支持从需求分析到系统实现的软件开发的全过程,它代表了面向对象的软件开发技术的发展方向。因此,学术研究和开发实践中,利用UML自动生成源代码的代码生成工具被设计开发出来,用于软件的设计。这类代码的非公知性同样由产生这些代码的UML决定。
语言转化工具用来对不同编程语言的源代码进行转化,以便增强源代码的重复利用能力。典型的有Java转C#工具,.Net平台下各种语言相互转化工具。对于通过转化工具生成的源代码非公知性鉴定,要考虑转化前原始源代码的非公知性。
除此之外,还有一些基于特定的开发工具和开发平台设计的软件系统,其源代码也存在自动生成的情况。无论哪一种情况自动生成的代码,对其进行非公知鉴定时都要综合这些代码生成的条件进行判断,而不能仅仅从源代码本身给出鉴定意见。
对于源代码是否为自动生成的代码,需要鉴定人根据经验来判断。一般情况下,自动生成的源代码在变量、函数、类、文件的命名上遵循相同的规则,源代码的格式安排,空行、空格、注释的使用规范等具有高度的一致性。
2.1.4 来自开源软件的源代码
开源软件(Open Source Software,简称 OSS),即公开源代码的软件,具备可以免费使用和公布源代码的主要特征[12]。由于其开放源代码,使得全球无数程序员和用户可以不断复制、修改、再发布开源软件源代码。大量企业为了节省人力成本、时间成本往往会在其设计开发的软件中或多或少的使用开源软件源代码,甚至一些软件就是在开源软件的基础上进行修改得到的。因此,开源软件源代码是影响源代码非公知性的重要因素之一。
司法鉴定实务中对于这类源代码应认为不具有非公知性。然而,由于开源社区分散、开源软件数量众多,而鉴定人知识有限,使得鉴定中如何判断源代码为来自开源软件的源代码变得十分困难。就作者的鉴定实践来说,可以从以下方面辅助做出判断结果。
首先,通过源代码的“协议声明”判断源代码来自于开源软件。一般情况下,开源软件的源代码文件头都会有开源软件遵循的协议声明,如果是简单、机械的引用这些代码,司法鉴定人员是可以通过协议声明辨识其来源和版权情况,而这种情况在作者参与的司法鉴定案件中是出现频率最高的。
其次,利用商业或非商业开源源代码搜索引擎系统。如果程序开发人员在使用开源软件时将相关声明信息删除,或者仅仅使用了开源代码中一个片段,这时司法鉴定人员就很难发现了。目前,存在一些商业和非商业的开源源代码搜索引擎系统,这些搜索引擎系统收录了海量的开源代码,并提取开源代码技术特征。商业类搜索引擎系统的使用价格往往较高,一般根据被鉴定代码的代码量多少来收费,如Black Duck Software[13]。非商业类的开源代码搜 索 引 擎 系 统 主 要 有 Krugle[14],Ohlohe[15],Docjar[16],Google Codes[17],CodeSoso[18]等。商业类与非商业类源代码搜索引擎系统的区别主要在于:商业类系统根据其独特算法自动提取被比对代码的技术特征进行批量比对,非商业类的搜索系统则要由搜索人员自己提取关键代码到系统中进行搜索。同时,也要注意到由于开源数据库的收录范围有限,鉴定人不能直接给出被鉴定源代码不具有非公知性的意见,还要结合第三种方式进行综合判断。
最后,鉴定人对被鉴定代码整体进行阅读理解,发现源代码编写风格与整体风格具有差异的部分,就差异部分的代码,分析其功能,在主要的开源社区和搜索引擎中查找与之具有类似功能的开源项目。如果被鉴定源代码通过上面第一、第三种方法的检测,在司法鉴定实践中一般认为其为非开源软件源代码。
2.1.5 第三方源代码
第三方源代码是指程序设计人员由于使用了特定的软硬件平台,从平台服务商获得的与平台开发相关的、能够节省开发周期的源代码,这种源代码既可以是免费的,也可以是通过硬件采购,与硬件搭配获得的。如应用微软.Net平台进行软件开发的程序员,经常在自己开发的项目中使用微软企业库的免费源代码。采购了Broadcom公司硬件设备时,经常用到由其提供的与设备操作相关的源代码。对于这类源代码本领域内的程序设计人员容易通过开发经验识别出来,而且这类源代码基本都有版权声明信息,部分源代码会在服务商提供的硬件使用说明书中有所体现。与开源软件源代码相似,来源于第三方的源代码也是影响源代码非公知性的因素之一,对于非公知性鉴定来说,两者没有本质区别,只是在软件使用范围、条件、知识产权保护形式上有所区别。因此,在司法鉴定实践中,两者的鉴定思路相同。
2.1.6 网络搜索或教科书中的源代码
一些软件开发人员在网络论坛中以问答的形式对完成某一特定功能的源代码实现进行提问和回答,将源代码放到网络论坛中。这种源代码一般都是比较短小的,大部分通过搜索引擎可以检索得到。另外,程序设计相关教科书中的一些源代码示例,特别是算法实现的源代码示例,也会在现实的软件程序中出现。这两种源代码都比较短,而且是解决程序设计当中一些通用的技术问题。由于两种类型的源代码是大众非常容易获取的,直接影响源代码的非公知性。司法鉴定中,鉴定人在阅读源代码时,根据经验,选择解决共性技术问题的源代码,并在搜索引擎中进行搜索,尽量发现这类源代码。如Pudn[19],Oreilly[20]均有针对计算机书籍中的源代码搜索功能。
2.1.7 业界通用的源代码
存在这样一类源代码,它完成的功能是某一领域内比较通用的功能。比如,管理信息系统中常用的用户登录验证,角色管理,权限管理。这些功能具有非常的普遍性,很多程序设计人员的设计思路和代码实现基本一致,而且这类代码经常在程序员之间、企业之间传递,有些已经成为业界通用的源代码,一般不具有非公知性。当然,有些企业从保护知识产权、促进创新角度,设计出不同于大众的源代码,则应划入具有非公知性的范畴。鉴定实务中鉴定人要结合具体情况具体分析。
2.1.8 表达唯一的源代码
这里所说的表达唯一,是指使用某一计算机语言编写、完成特定功能的源代码,其代码编写形式有限,如采用C++或C#获取计算机硬件信息的代码。这种代码由于表达形式有限,不同程序设计人员编写出相同源代码的几率比较大。因此,直接影响了源代码的非公知性。
司法鉴定中,在判断源代码唯一性上,需要注意两个问题,一是表达“唯一”,并不是真正的一种表达;二是,以函数为划分单元,判断源代码是否表达唯一,不应孤立的判断某一行代码是否为表达唯一的源代码。
2.2 源代码非公知性鉴定的适用流程
上述影响源代码非公知性因素的第3.1.1、3.1.2、3.1.3条可归结为“该信息无须付出一定的代价而容易获得”,第 3.1.4、3.1.5、3.1.6条可归结为“该信息从其他公开渠道可以获得”,第3.1.7、3.1.8条可归结为“该信息为其所属技术或者经济领域的人的一般常识或者行业惯例”。在鉴定过程中,通过对这些因素的综合分析,判断源代码的非公知性。同时,可以通过建立规范化的鉴定流程,来降低鉴定人的工作强度,加快鉴定的实施。基于以上8项主要因素的分析,本文设计从简单到复杂的软件源代码非公知性鉴定流程(图1)。
2.2.1 判断源代码是否容易获得
在不阅读源代码功能含义条件下,理解源代码所应用的技术特征,源代码编译后的目标码运行环境特征,依次逐步深入判断源代码是否为B/S架构软件浏览器(客户端)可获得的源代码、反编译可获得的源代码、自动生成的源代码。如果三种情况均不满足,转而判断源代码是否为常识和行业惯例。
如果源代码满足上述中“为B/S架构软件浏览器(客户端)可获得的源代码”或“为自动生成的源代码”或“为反编译可获得的源代码,并且容易获得目标代码”,继续看源代码的使用情况,即源代码编译的目标码构成的软件系统在销售给客户时,是否有限制客户向非授权用户进行泄露软件相关信息的保密协议。若没有保密协议,说明源代码容易获取,具有公知性。若存在保密协议,转而判断源代码是否为常识和行业惯例。如果满足“为反编译可获得的源代码,但目标代码不易获取”,直接判断源代码是否为常识和行业惯例。
2.2.2 判断源代码是否为常识和行业惯例
在不做检索的条件下,阅读代码功能含义,根据鉴定人知识和经验,依次判断源代码是否表达唯一、是否业界通用。满足两个条件中的任一条件,源代码具有公知性;否则,转而判断源代码是否公开。
2.2.3判断源代码是否公开
鉴定人的知识是有限的,在判断源代码是否公开问题上,鉴定人以了解技术进展,丰富知识为目的,进行基本的信息检索,是十分必要的。因此,鉴定人在理解源代码含义条件下,应充分利用搜索引擎、开源社区等网络资源,结合自己的知识和经验积累判断源代码是否公开。如果源代码经过这一步的层层验证,司法鉴定实务中一般认为源代码具有非公知性。
2.3 作为特征算法或核心(专有)技术的源代码非公知性鉴定
以上影响源代码非公知性的因素分析和鉴定流程,适用于大部分的源代码非公知性鉴定。但在司法鉴定实践中往往会出现这样的情况:作为软件某个特征算法或核心(专有)技术的部分源代码具有公知性,另一部分则不具有公知性;而源于委托方的鉴定事项则是针对算法或核心技术涉及的整体源代码。针对这种情况,鉴定实务中应从两个视角考虑,一是局部视角,二是全局视角。局部视角不考虑代码之间的调用关系,组织结构,依据图1的鉴定流程,针对各个部分的源代码分别给出非公知性的鉴定意见。全局视角考虑代码之间的逻辑调用关系,将这种逻辑调用关系作为源代码非公知性判断依据之一,从整体上给出鉴定意见。
图1 软件源代码非公知性鉴定流程
一般来说,在考虑源代码之间的逻辑调用关系,组织结构时,首先通过对源代码的阅读,梳理出源代码逻辑关系鱼骨图(图2)。任何算法或关键技术的源代码都可以归结为代码文件、类和函数的表现形式。算法和关键技术的实现按照一条主线进行,同时,不断的调用各个代码文件、类和函数,构成支线。如果算法或核心技术主线上的源代码具有非公知性,那么整体上可以给出代码非公知性的意见。
图2 源代码调用关系鱼骨图
3 案例应用
3.1 简要案情
2011年4 月,深圳迈某公司向深圳市中级人民法院起诉理某公司,就其相关产品涉嫌使用迈某公司的有关技术提出法律诉讼,包括心电监护仪嵌入式软件商业秘密。为审理该案,由法院委托、双方共同选择和认可的司法鉴定机构对双方心电监护仪嵌入式软件进行源代码非公知性、同一性鉴定,目标代码同一性鉴定。
3.2 司法鉴定
该案涉及软件源代码非公知性、同一性鉴定,目标代码同一性鉴定,源代码与目标代码的同一性鉴定。其中源代码的非公知性鉴定具有典型意义:一方面,迈某公司主张的具有非公知性的源代码是其监护仪的核心源代码,而非全部源代码;另一方面,通过鉴定发现核心源代码中的部分代码可以在网络中检索得到,即源代码部分公开。该案鉴定采用论文3.2的鉴定策略,对源代码的非公知性进行逐一分析,鉴定结论分别从源代码局部和整体两个角度进行。针对各个部分的源代码分别给出非公知性的鉴定意见。同时,考虑到代码的整体逻辑调用关系,各部分代码的选取和组合蕴含创造性劳动,并非简单罗列、堆砌而形成,可以构造出类似3.3的代码结构关系图,给出了整体源代码的非公知性鉴定意见。
3.3 法院判决
深圳市中院一审判决迈某公司胜诉,理某公司向广东省高院提起上诉,广东省高院就理某公司不服该一审判决提起的上诉进行二审,2016年10月二审裁定理某公司侵权成立。
4 结语
以源代码非公知性鉴定为支撑的软件商业秘密维权案件迅速增加,在看到这种方式对知识产权保护起到积极作用的同时,也应注意到其对促进市场竞争、技术进步、防止知识产权滥用上的弊端。无论是对诉讼的控诉方,还是被诉方,源代码非公知性对于整个诉讼起到了至关重要的作用,一旦诉讼成功,对被讼方的处罚力度较大。因此,软件源代码非公知性鉴定对鉴定人的技术能力、鉴定经验和职业道德都提出了极高的要求。