查看原文
其他

来稿精选 | 李耀:“程序漏洞”中“认识错误”的内容与边界

李耀 刑事法判解 2023-04-15


《刑事法判解》由北京大学法学院主办,陈兴良教授任主编,车浩教授任执行主编,人民法院出版社发行。刊物关注刑事司法领域的实务问题,诚邀学界和实务界同仁赐稿。


公号&刊物来稿请至:xingshifapanjie@126.com

“程序漏洞”中“认识错误”的内容与边界


by   李耀

北京大学2020级刑法学硕士

导读:本文为“刑事法判解”微信公号“肯德基羊毛案”征稿(《刑事法判解》征稿| 肯德基羊毛案的罪与罚)之来稿精选。本文从技术角度对本罪的行为方式展开了深入分析,展现出作者关于计算机系统和程序漏洞的丰富知识,相当生动地为读者解释了本案行为人究竟是怎么薅的羊毛,通过程序漏洞对被害人错误进行类型化的思路,也颇具创意。作者实际上是在考察智能系统背后的人有没有被骗的问题,并对此进行类型化思考,最终得出了对于“非人工智能算法”系统应考虑构成维持错误认识型诈骗,对于“决策树、朴素贝叶斯等人工智能算法”考虑构成制造错误认识型诈骗,这一论点相当新颖,值得关注。

不过,作者最终以漏洞大小和漏洞被利用的概率大小作为判断诈骗罪成立的标准,并认为在“错误具有高度盖然性出现可能”的情况下才能认定成立认识错误,尚需进一步论证。诈骗罪中的认识错误能否直接等同于被害人过错,也存在疑问。


一、孟某某怎么薅的羊毛?


对于孟某某利用肯德基漏洞“薅羊毛”的具体过程,本案判决语焉不详,但是利用何种漏洞以及如何利用对本案定性有决定性影响。在关联案件(2019)沪0104刑初1045号判决中,法官对被告人利用漏洞的行为作了展开说明,“本案中的各被告人利用XXX公司旗下品牌肯德基APP客户端和肯德基微信客户端之间的数据不同步,采取先在其中一个客户端用套餐兑换券下单待支付,在另一个客户端操作对兑换券退款,再将之前客户端的订单取消并重新获取兑换券;或者采取先在其中一个客户端用套餐兑换券下单待支付,在另一个客户端操作对兑换券退款,再将之前客户端的订单确认提交后获得取餐码”,进而断定“无论哪种方法,被告人是利用系统的数据不同步来实施犯罪,并非系统本身发生的机械故障或者缺陷。”结论下的未免过于仓促了些。


据业内人士分析,本案“羊毛”之所以能被薅,主要原因是系统存在缺陷:某一客户端程序对“兑换券”相关指令设计的逻辑判断过于简单且采用前台页面展示数据。实际上,“肯德基”微信客户端与“肯德基”APP客户端不存在所谓的数据不同步问题,因为两者都指向同一个或者至少关联的后台数据库,否则“肯德基”网上运营系统会非常容易崩溃。本案的数据不同步仅仅是前台页面的客户端展示的数据不同步:“肯德基”微信客户端与“肯德基”APP未主动刷新页面将后台数据更新至前台页面中。而程序员对“兑换券”设计的逻辑判断又是以前台数据为依托。具体而言,“先在其中一个客户端用套餐兑换券下单待支付,在另一个客户端操作对兑换券退款,再将之前客户端的订单取消并重新获取兑换券”,其逻辑链条其实是:第一个客户端用兑换券下单→第一个客户端取消下单→第二个客户端退款,数据上传后台数据库→第一个客户端仅以前台“取消下单”作为“兑换券”返还判断依据→第一个客户端未使用后台数据对“兑换券是否已退款”进行判断→被告人通过第一个客户端重新获取兑换券;“先在其中一个客户端用套餐兑换券下单待支付,在另一个客户端操作对兑换券退款,再将之前客户端的订单确认提交后获得取餐码”,同样也是“兑换套餐”时对接口不作后台数据库检查,而仅以前端未更新数据为准作简单逻辑判断。

由此看来,造成本案损失的原因,从被害人的视角来看,就主要在于前台未主动更新获取后台数据、代码设计过于简单、粗疏,在用户请求时遗漏后台检验的步骤。由于苛求前台数据及时更新既不现实也不必要,代码本身的漏洞就成为了致命缺陷。那么对于这一缺陷,行为人的利用行为是否造成了“被害人陷入错误认识”进而可以将行为评价为诈骗罪?对此需首先对程序漏洞型诈骗行为的构造进行分析。
 

二、程序漏洞型诈骗罪的“维持错误认识”构造


 (一)程序漏洞如何出现

计算机程序设计与代码编写往往是由需求驱动,在代码之外人为设定需求目的,要求代码实现一定的功能。程序员将设计需求转变为一行行代码的过程就是所谓的“需求实现”的过程。例如需要登录系统查验账户密码以保障账户使用安全,程序员就会将这一需求转换为登录UI界面的“用户名”“密码”以及防撞库的“验证码”或其他验证图片,并将“用户名”“密码”“验证码”等同后台相联系,尤其是具备身份性质的“用户名”与“密码”将直接同后台个人账户进行匹配,一旦匹配成功,程序便放行允许进入进行下一步操作。在这一过程中,如果输入“用户名”与“密码”的人并不是后台所记载的账户所有人,“需求”同“需求实现”便出现了错误,账户安全的“需求”与最终通过代码实现的结果不相符,“需求实现结果”出了错。既然出现了错误,就需要对用户登录系统作出调整,设置更为严格的IP检测与手机验证码检测,以达致“需求”与“需求实现结果”之间的再统一。这种“需求”“需求实现”“需求实现结果”之间的动态联系,体现了归纳错误与错误后再归纳的思维方式,通过不断更新判断条件实现归纳的稳健性。
 

(二)程序漏洞型诈骗实行行为定型化

 
在交易类程序中上述逻辑错误链条因处分意志的介入转变成了抽象同意-具体同意-同意错误。例如,在事前,商家给予“特定情况下处分财产”的需求,因而表达了商家“特定情况下”对于财产处分的“抽象同意”,商家希望在特定条件满足时程序代其进行财产处分。而这种抽象同意经由程序设计转变成了“A、B、C等情况下处分财产”的一连串代码,代码运转进而生成了“具体同意”。但交易情形错综复杂,仍然存在即使A、B、C都满足但在实质上不符合商家预期的情形。由于代码未及时修正,程序仍然在持续运作发出“具体同意”的要约。最终在若干交易中呈现出“抽象同意”与“具体同意”的割裂,也即“同意错误”问题。但要注意的是,这种“同意错误”虽出现于“具体同意”的输出环节,却根源自“具体同意”的形成:正是对“抽象同意”的不完全归纳与错误具象化,才导致了程序以不符合“抽象同意”的形式进行交易。所以说,这一错误并非产生自“黑天鹅”登场,而是根源自“白天鹅”命题的形成。换言之,这一错误是自发性的认识错误,商家误以为代码完善而给予其处分权任其自动化交易,却不知代码相当不完善,存在较大漏洞,尤其是代码对“需求”的不完全归纳处理。而错误交易的出现只是程序漏洞的显性表现而已,商家被自己骗了。

这种程序其运行机理可以通过经常举例的自动售货机进行理解。对于后者,如采用投币的方式购买商品,机器对货币真实性的判断其实来自于事先对真币诸特点的总结:材质、尺寸、特性等,在机器上设置相应元件并在系统中调整函数与参数对特定内容进行检验,如所投之币符合条件,在多个元件出现反应后,信息传递给售货机系统,商品就会出现。在货币检验的过程中,元件越多,检验内容越细,假币被识别为真币的可能就就越低,漏洞也就越小。但如仅以“材质”这一条件作为真币检验内容,漏洞就会非常大,而商家将这样的售货机摆放运营希望营利,就纯属自欺欺人。

因此,在程序存在漏洞的情况下,商家本身就存在着一种自发性、原初性、潜在性认识错误,只是这种认识错误,在行为人介入之前并没有显性外化。行为的介入是这一错误暴露的契机。故而,行为人明知程序存在漏洞,且商家对此不知悉而存在错误处分,就属于隐瞒真相维持他人错误认识,被骗人基于错误认识处分财产,被害人受损而行为人获益,若满足罪量要素,此时行为就成立诈骗罪。

对这种程序漏洞型诈骗罪的理解,还要注意被害人产生的认识错误并非行为人造就,而是于程序生成之日起业已存在。在这一类存在“程序漏洞”的案件中,被害人的遭受的损失实际上是多因一果,是被害人认识错误与行为人隐瞒维持错误共同塑造。这也是这类案件在舆论中未顺利实现对被告人“污名化”的原因:被害人在自动化决策中确确实实有过错,其法益自始就处于巨大风险之中。可是,由于行为人通过其行为给被害人财产法益创设了更为具体的危险实现流程,且被害人的“同意”存在错误不属自我答责范畴,故而损害结果就属于其行为危险的现实化,可得以归责承担客观责任,不因被害人行为介入阻断客观归责流程。

而如果将认识错误的生成时间点推迟到行为介入时,认为行为人实施的是“虚构事实”行为,那么就会出现一个比较棘手的问题:程序幕后的管理者在没有同行为人产生任何接触的情况下,其错误认识是如何产生的?为回答这一问题,就不得不去论证“在交易发生时,交易的情况与程序设计者希望发生的交易不符,但程序仍然给付,因而存在认识错误下的财产处分。”但事实上,在交易过程中根本不存在所谓的程序设计者或商家,“甩手掌柜”在程序中设计处分规则后,已经在忙其他的事情了根本没有注意到程序上某笔交易与其意图不符,财产处分是基于其事前的“抽象同意”演化的“具体同意”而实施。

当然这里讨论的程序仅限于非人工智能算法,人工智能算法由于具备规则创设的功能,管理者事先的“抽象同意”并没有在算法中得以具体化,而是在算法运算中产生,因而其认识错误是在欺骗行为介入时才产生。
 

(三)“认识错误”的边界:并非所有程序漏洞都能导致被害人事前存在错误认识

 
程序漏洞指涉“需求”不充分实现的场合,也就是说商家的“特定情况出现时处分财产”的抽象意志未得以在具体程序中被完全归纳。只有在这种情况下才存在归纳错误的逻辑问题,也只有在这样的逻辑问题的基础上,才能说商家的抽象同意与具体交易中的具体同意之间存在错误,进而产生“同意”的错误问题。这实际上说明“程序漏洞”型诈骗行为的一个重要特征就是存在“被害人过错”。

在行为人积极建构虚假事实的场合,尽管也存在“同意”的错误问题,但是相对于行为人的“花言巧语”,被害人的行为对于财产损失一般不存在过错。而在行为人隐瞒真相的情况下,被害人在交易中的不谨慎正是造成损失的原因之一。若非行为人存在作为义务,受损结果就应被害人自己承受。可以说,法益受损之结果在归因于行为人具备可罚性的举止的同时,亦可同时归因于被害人过错所塑造的法益危险状态。这种“被害人过错”的特征也充分体现在了“程序漏洞”型诈骗行为之中:被害人太过于信任程序代码,而其代码的设计细密程度又不值得其“托付”。因此在诈骗罪被害人自发陷入认识错误的场合,其“认识错误”必须反映“被害人过错”这一本质。

在明确“程序漏洞”型诈骗行为构造中“认识错误”的“被害人过错”本质后,需要进一步思考的是“程序漏洞”导致“认识错误”的周延性问题。将目光重新聚焦到现实,我们会发现由于几乎所有的程序都存在其局限性,其对于程序运作背后的“需求”不可能完全实现,或多或少存在缺憾。如果将所有的程序漏洞都视为代码设计的错误,进而认为其导致了商家处分权的“错付”,程序员可能会忿忿不平地跳出来说:“我竟想不到用户的使用方式如此奇葩,我穷尽了一个正常程序员的想象力,也想不到还会有这样的漏洞。”在此情况下,视代码设计漏洞为错误交易的“过错”,无法对被害人的进行有效的行为指引。另外,也要注意“被害人过错”不仅是一个刑法上的重要量刑情节,也是民法上减免赔偿责任的事由,如果简单把算法的不完全归纳错误同法律中的被侵权人或被害人的“过错”划等号,而减轻行为人责任,无法实现“过错与责任相适应”的公平理念。因此,基于“被害人过错”这一“事物本质”,对“认识错误”的理解必须克制,对此可从导致“认识错误”的“程序漏洞”处着手,通过限制“程序漏洞”的范围来厘清“程序漏洞”型诈骗行为中被骗人“认识错误”的边界。

本文认为,在代码不完善以至于抽象的处分意志无法高度盖然性得在具体同意中被实现的情况下,才能成立“认识错误”。之所以采用“盖然性”的概率标准,理由在于程序设计是一个经验性问题,也是一个不断试错、不断解决BUG的过程。正如前文所提,“需求实现”乃对经验的归纳、提炼。对于一个为解决重复交易设计的程序,如果设计中无法穷尽所有可能性去排除“错误”,实现交易安全的盖然性,贸然投产使用就是人为创造交易风险,必然存在着过错。比如,商家设计的代码未设置支付宝余额检验环节,在行为人使用无余额的支付宝完成付款步骤后向其出售商品,程序出现重大疏漏导致了商家事先存在“交易将顺利进行”的错误认识,行为构成诈骗罪。
 
三、本案是否存在程序漏洞下的“认识错误”?
 
如前所述,孟某某薅羊毛,是通过“肯德基”微信小程序与APP页面数据不及时更新而其程序算法又以页面数据作为判断依据这一漏洞得以实现。由于这一漏洞并非人工智能程序计算错误,而是代码设计者对交易安全未详尽考虑,未对判断规则进行严格限制所致,将本案理解为诈骗罪,就需要将“认识错误”的时间点追溯到代码设计之时。那么在回答本案相关行为是否构成诈骗罪的问题上,最需要回应的是本案的程序漏洞是否造成了被害人陷入“认识错误”。

本文认为,尽管这一漏洞直接指向了处分意识,但由于代码的设计可以在高度盖然性的情况下实现商家对“兑换券”的相关处分行为的“抽象同意”,被害人并不存在过错,因而不能在刑法上肯定这一漏洞导致了被害人认识错误的形成。即使我们认可“被害人如果知悉便不会继续交易”,同时也存在不完全归纳的情形:代码设计者没有将排除条件纳入其中,没有进一步通过排除归纳法排除其他情形。但是这一程序漏洞发生的可能性非常之低。因为这一类漏洞纯粹属于技术性漏洞,行为人若非内部人员或破解程序获取源代码亦或是在非常偶然情况下“误操作”发现,根本无从得知这一漏洞。在面向一般人的重复交易之中,交易安全仍然会得到保障,其“抽象同意”与“具体同意”之间的错误不具备“高度盖然性”获得实现。因此,对于本案程序的算法错误,被害人即使存在“错付”,但不存在“过错”,故而不符合“认识错误”的本质特征,不能认为被害人陷入了认识错误。

综上所述,本文认为孟某某的行为不构成诈骗罪。

作者注:本文分析深受车浩教授《盗窃罪中的被害人同意》一文影响


--

▼ 推 荐 阅 读 ▼

R E C O M M E N D

《刑事法判解》征稿启事网络支付下盗窃罪与诈骗罪的区分适用来稿精选 | 王家伦:论“肯德基羊毛案”之罪名选择征稿 | 肯德基羊毛案的罪与罚




▼ 欢迎赐稿 ▼



来稿请至:xingshifapanjie@126.com


欢迎各种面向刑事司法实务的文章向公众号投稿,我们将择优刊登于《刑事法判解》的纸质刊物,为作者提供网络传播和纸质发表的双重渠道,为读者提供更快捷有效的实务信息。



感谢支持٩(ˊᗜˋ*)و

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存