张乃珩
〔英国 泰恩河畔纽卡斯尔大学〕
随着信息技术的不断发展,各类软件应用已经渗透到人们工作生活的方方面面,涉及软件鉴定的案件也愈来愈多。在司法鉴定实践活动中,软件鉴定需求迅猛发展,软件鉴定方法相对滞后,需要司法鉴定人在鉴定实践中不断探索,完善科学有效的软件检验鉴定机制。
软件已经广泛运用到人们的生产生活中,极大地提高了生产效率,方便了人们的生活。在司法鉴定活动中,涉及软件鉴定的案件通常有以下几种。
1.侵犯专利权案
在软件司法鉴定过程中,侵犯专利权的案件较少,因为我国《专利法》规定“智力活动的规则和方法”不能授予专利权,所以单独的计算机软件不能够授予专利权。如果某项发明的实现过程中包含有计算机软件部分,这部分软件可以申请发明专利。
2.侵犯著作权案
在侵犯著作权案中把软件作为作品进行保护,在受到侵犯时适用《著作权法》《计算机软件保护条例》进行保护。
我国《著作权法》第三条第八款明确规定,计算机软件受著作权法保护。《计算机软件保护条例》第六条规定,本条例对软件著作权的保护不延及开发软件所用的思想、处理过程、操作方法或者数学概念等。
从上述法律规定可以看出,通过《著作权法》和《计算机软件保护条例》保护计算机软件,主要是对计算机软件的形式进行保护,重点是计算机软件的固有形态。
在这类案件中,软件的检验鉴定主要对象是软件的一致性和相似性。通过对检材软件与样本软件进行比对,得出是否一致或实质相同的鉴定意见。
3.侵犯商业秘密案
把软件作为商业秘密是计算机软经常采用的一种保护方式,在软件受到侵害时可以适用《反不正当竞争法》。《反不正当竞争法》规定,商业秘密是指不为公众所知悉、具有商业价值并经权利人采取相应保密措施的技术信息、经营信息等商业信息。
把软件作为商业秘密进行保护,既能保护软件外在表现形态,又能保护软件开发人员采用的软件设计思想、设计方案、数据结构、核心算法等要素,只要软件的这些核心要素满足商业秘密的标准就可获得保护。
在这类案件中,需要明确保护的密点,鉴定密点的“不为公众所知悉”属性。
4.破坏计算机信息系统案
还有一类就是利用软件从事非法活动,获取不正当利益的案件,这类案件通常会触犯破坏计算机信息系统罪。根据《中华人民共和国刑法》第二百八十六条规定,破坏计算机信息系统罪是指违反国家规定,对计算机信息系统功能或计算机信息系统中存储、处理或者传输的数据和应用程序进行破坏,或者故意制作、传播计算机病毒等破坏性程序,影响计算机系统正常运行,后果严重的行为。
在这类案件中,通常需要对软件的功能进行检验鉴定,做出软件是否具有某项功能的鉴定结论。
由于软件技术发展非常迅速,软件应用的范围也非常广泛,在软件鉴定过程中存在不同程度的挑战。
1.检材软件多样性方面的挑战
在软件的鉴定过程中,委托方提供的检材软件差别很大。(1)软件的运行平台不同,有的软件运行在windows平台,有的软件运行在Linux平台,有的运行在Android平台,有的运行在IOS平台,有的运行在嵌入式系统中。(2)软件编写使用的语言各异,有的软件用C语言,有的用java语言,有的用Python脚本,有的用.net语言编写等。(3)检材呈现的形态不同,有的是程序源代码,有的是目标程序,有的是虚拟机镜像文件,有的是磁盘镜像。(4)检材的功能各异,有的是行业专用软件,有的是游戏软件,有的是恶意代码,有的是网站源码。(5)委托方鉴定要求不同,有的要求对软件功能进行鉴定,有的要求相似度鉴定。总之,检材软件的多样性给鉴定工作带来了一定挑战。
2.软件核心算法等要素认定方面的挑战
软件是开发人员智力活动的产物,是开发者通过编程语言实现特定功能的产物。一些大型专用软件,往往是开发团队经过长时间不断开发测试研发出来的成果,一些核心算法和核心数据结构具有较高的科技含量。在窃取商业秘密等件中,原告往往把软件的设计思路、软件架构、数据结构、核心算法等作为商业秘密进行保护。司法鉴定人员由于受专业和环境限制,不可能全面完整地理解软件的设计思路、软件架构、数据结构、核心算法等核心要素,只能根据自己的知识和经验,按照司法鉴定程序对软件进行检验鉴定。在软件的核心要素鉴定方面,司法鉴定人员面临较大挑战。
3.软件源代码“不为公众所知悉”认定方面的挑战
目前,商业秘密的非公知性鉴定尚没有统一的行业标准。在软件侵权案件中,如果作为商业秘密的软件被窃取,在证明其是否符合“不为公众所知悉”标准时,主要依据是最高人民法院《关于审理不正当竞争民事案件应用法律若干问题的解释》第十条第三款。在司法鉴定中,一方面鉴定人员主要通过大量的检索来反证“不为公众知悉”,这与鉴定人员自身所掌握的资源有很大关系。另一方面依靠鉴定人员自身的行业经验进行判断。在源代码是否符合“不为公众所知悉”标准的认定方面存在一定的挑战。
4.软件功能认定方面的挑战
功能鉴定是软件鉴定的一项重要内容。在司法鉴定实践中,软件功能鉴定有以下几个方面的困难。一是缺少相关的操作标准和规范。软件功能鉴定的相关标准规范较少,由于软件功能的多样性,相关规范没有明确规定具体检验鉴定方法和检验鉴定流程,操作指导性不强。二是需要鉴定的软件功能繁杂。在进行检验鉴定的过程中,软件运行环境不同,功能各异,甚至有些鉴定人员闻所未闻的功能。三是在检验鉴定过程中,有软件功能往往比较模糊,无法通过具体的标准进行衡量。比如,在某一案件中,委托方提供了一款软件,要求认定该软件是否具有赌博功能,但没有明确的相关规定对赌博功能和游戏功能进行区分。因此,在某些功能认定方面具有一定挑战。
目前,电子数据司法鉴定依据主要有国家标准、公共安全行业标准以及司法鉴定领域专家认可的方法等。依据司法鉴定相关标准和规范,在软件司法鉴定实践中,通常从以下几个方面开展鉴定工作。
1.一致性鉴定
涉及软件一致性鉴定的国家推荐性标准有一个,即《电子物证文件一致性检验规程》(编号:GB/T 29361-2012),该标准规定了文件一致性的检验方法,即通过哈希值计算,如果文件哈希值计算结果相同,则文件相同,否则文件不一致。行业标准《电子物证软件一致性检验技术规范》(编号:GA/T 828-2009)详细规定了软件一致性的检验鉴定对象、方法、步骤等内容。
在司法鉴定实践中,软件一致性检验的基本方法是通过对检材文件和样本文件进行比对得出检验结论。具体操作是对检材文件和样本文件分别进行哈希值计算,如果两个文件的哈希值一样,则说明两个文件一致,否则,文件不一致。目前常用的哈希校验算法有MD5、SHA-1、SHA-256等。在检验过程中,为防止哈希碰撞,通常使用两种哈希算法对文件进行哈希校验。软件文件一致性检验的对象包括源程序、目标程序中的目录、文件等。
比较常见的哈希值计算工具有Hashcalculator、quick-wash等,Linux下使用md5sum命令可以计算文件的MD5值,shasum命令可以计算文件的SHA1值,另外许多取证软件也都带有哈希计算功能。
2.相似性鉴定
相似性鉴定的行业标准是《软件相似性检验技术方法》(编号:GA/T 1175-2014),规定的检验内容有安装程序检验、安装过程检验、安装后的程序检验、程序的使用过程检验、核心程序的逆向分析等。
相似度检验主要是通过检验比对,确定检材与样本之间的相似度。通常进行四个方面的比对:一是源代码间的比对。对检材和样本的目录结构、文件名、文件内容、函数、变量等进行比对检验,检验时应排除文件名、函数名、变量名等因素影响。二是与目标程序的比对。包括安装前目录结构、文件等比对;安装过程中安装步骤的比对;安装后的目录结构、文件名、文件内容比对;软件使用过程中屏幕显示内容、功能等的比对。三是将源代码编译成目标程序后再进行比对,其比对方法与目标程序的比对相同。四是检材与样本中软件文档的比对,包括目录结构、文件名称、文件内容、文件属性等。
为了鉴定源代码(或文档)的相似度,需要使用代码比对工具对检材源代码与目标源代码(或文档)进行比较。常用的代码比对工具有WinMerge、Diffuse、Beyond Compare、Code Compare、AptDiff、UltraCompare、Altova DiffDog等。
3.功能检验鉴定
涉及软件功能检验鉴定的标准规范有《电子物证软件功能检验技术规范》(编号:GA/T 828-2009),规定根据送检要求对软件功能进行检验,并未规定检验鉴定的具体方法步骤。行业标准《网络游戏私服检验技术方法》(编号:GA/T 978-2012)规定了针对网络私服的检验鉴定方法,明确了检验对象,其鉴定方法与《电子物证软件一致性检验技术规范》中的检验方法基本一致。
其他涉及计算机软件检验鉴定的标准规范还有《程序功能检验方法》《法庭科学Android系统应用程序功能检验方法》等,限于篇幅,本文不再详细介绍。
通过对软件检验鉴定的相关标准规范和基本检验鉴定方法分析可以看出,软件的检验鉴定主要是通过对源程序、目标程序、文档资料等进行比对检验,内容包括程序源代码、目录结构、文件内容、安装过程等。在司法鉴定实践中,如果仅仅依据相关标准规范开展检验鉴定,难以满足软件鉴定的现实需求,特别是对软件功能方面的鉴定,由于没有具体的检验操作规范,检验鉴定工作难以规范开展。
为了应对计算机软件鉴定实践中面临的挑战,需要在严格按照司法鉴定相关程序规范的基础上,对软件鉴定部分进行如下改进。
1.软件功能检验鉴定改进建议
功能性鉴定是对某一款软件是否具有某项或多项功能进行检验鉴别,在具体的检验鉴定方法上,建议采用静态分析和动态测试相结合的方法。
静态分析的目的是通过分析源代码,找出相关功能模块,证明其是否具有某项功能。具体检验步骤包括:(1)搭建源代码静态分析环境,比如源代码的集成开发环境等。(2)确定功能模块,即确定实现某一项功能的核心模块。(3)对功能模块进行分析检验。
动态功能测试的目的是判断特定软件是否具有某项功能。动态功能测试包括在模拟仿真环境中测试和在实际应用环境中测试两种方式,基本检验方法如下:(1)在进行软件功能测试前,确定测试目的。(2)确定软件测试环境。根据软件的具体情况确定软件的测试环境。如果具备在真实环境中测试的条件,就在真实环境中测试,如果不具备,则需要搭建模拟仿真环境。(3)使用测试分析工具,对软件的功能进行测试分析。比如,使用数据包抓取工具可以分析软件与外界的通信情况、使用软件行为分析工具可以分析软件的行为特征等。(4)通过测试,得出是否验证测试目的的结论。
常用的软件功能分析辅助工具有行为监控工具,如Sysinternals工具集;恶意软件行为分析工具,如Malware Defender;数据包抓取工具,如Fiddle、Charles、Wireshark等;逆向分析工具Reverse、IDA、APKTOOL等;虚拟平台工具VMware、KVM、Xen等。图2是利用数据包抓取工具Fiddle分析某款软件是否具有赌博功能时的截图,通过对软件通信数据的分析,找到了该软件与某钱包平台(跑分平台)通信的证据。
2.软件密点鉴定的改进建议
在涉及软件鉴定的商业秘密侵权案件中,不建议把整个软件作为秘密进行鉴定,而是把软件设计的核心要素作为秘密,在鉴定前需要确定密点,对密点进行检验鉴定,检验方法如下。(1)由原告提供其主张的密点。(2)梳理原告提供的密点,在密点基础上构建特征模板,包括软件设计目标、设计思路、核心功能模块、核心算法、数据结构、重要参数、数据库结构等要素。(3)制定检验鉴定方案,针对检材和样本的密点进行检验鉴定。
下面举例说明特征模板的构建方法。假设原告主张的软件密点为深度优先搜索算法,根据原告主张的密点,可以构建如下特征模板:
设计目标:遍历所有节点。
设计思路:从顶点出发,首先访问顶点,从未被访问的邻接点出发,以深度为优先,搜索遍历图中所有节点。
采用数据结构:栈结构。
代码模块:略。
实现步骤见图1。
图1 深度优先遍历示例图
具体如下:
(1)以A为起点开始遍历,输入A点信息,A入栈。(2)从A的邻接节点B、D、E任选一个点,如选B点,输入B点信息,B入栈。(3)从C、D任选一点,如选C点,输入C点信息,C入栈。(4)回退到B节点,C出栈。(5)输入D节点信息,D入栈。(6)回退到B,D出栈。(7)回退到A,B出栈。(8)输入E点信息,E入栈。(9)回退到A,E出栈。(10)回退到空栈,A出栈。
通过对样本和检材特征模板比对分析,检验该检材密点与样本是否相似或实质相同。
3.软件非公知性鉴定改进建议
对于计算机软件的非公知性鉴定,建议从以下几个方面进行。(1)依据鉴定人(或鉴定团队)的经验进行判断,即鉴定人是否认为申请方主张的秘密是一般常识。如果鉴定人根据自己的行业经验认为是一般常识,那么不构成非公知性。比如某软件的文件搜索算法采用的是“B+树”算法,由于很多计算机从业人员都知道该算法,该算法就不具有非公知性。(2)通过百度等搜索引擎对相关内容进行查询,如果查询结果中存在与秘密相同或者实质性相似的内容,那么申请方主张的秘密就不具有非公知性。(3)在开源软件社区进行搜索,如果查询结果中存在与秘密相同或者实质性相似的内容,就不具有非公知性。(4)通过CNKI、维普资讯、万方等论文检索平台对相关关键字进行检索,如果检索到与秘密相同或者实质性相似的内容,那么申请方主张的秘密就不具有非公知性。(5)对计算机软件进行反编译,如果软件没有采取任何安全保护措施,通过简单的反编译就可以很容易获取,那么该软件就不具有非公知性。
总之,在信息技术飞速发展的今天,软件技术的发展也日新月异,软件应用愈来愈广泛,司法鉴定人员需要在实践中不断学习,对司法鉴定实践中遇到的问题不断讨论研究,保证司法鉴定的科学客观、公平公正。