什么是軟件
就...前一段時間據(jù)稱某個電子商務平臺被發(fā)現(xiàn)利用系統(tǒng)漏洞在用戶不知情的情況下——我們不知道用戶是否同意因為那個沒有人會讀的《最終用戶許可協(xié)議》是可能具有法律效力的,或者說:誰讓你沒讀呢——但至少它發(fā)生的時候用戶是不知情的——利用用戶設備的數(shù)據(jù)進行了一些有利于該平臺的行為。
本文可以視為對這次事件的評論。
cc-by-sa 4.0
cc-by-nc-sa 4.0
從一般用戶的角度而言,軟件直觀上是存儲在在用戶設備中可供運行的程序文件,如果它不運行在用戶設備中而是運行在別處的話,它可能并不會存儲在用戶設備上,但它總之還是某個程序文件。
不過這種視角只看到了軟件的某一種狀態(tài),并且那一個特定的程序文件只是軟件的一個“副本”。但話說回來,指著一本《紅樓夢》說“這不是《紅樓夢》而是《紅樓夢》的副本”好像并沒有什么意義,因為就其承載的內(nèi)容而言每個特定版本的《紅樓夢》都是“完全相同”的,有意義的不是它的承載形式而是它的內(nèi)容。
所以在這個意義上說,軟件是軟件的二進制表示。因而,更進一步的,我們可以說,軟件是軟件的代碼,因為無論是二進制的“編譯產(chǎn)物”還是文本形式的“源代碼”,都只不過是這個軟件的不同“承載形式”,就其“用于指導處理器和計算機執(zhí)行特定任務”的內(nèi)容而言,它們是相同的。
所以,就其本質(zhì)而言,軟件是一種知識。
如果和書籍類比的話,它像是字典或手冊。你不會記下手冊中的全部內(nèi)容,但當你需要完成某項任務時,你會打開手冊,按照其中的說明進行操作。當你需要使用計算機完成任務時,你會打開軟件,執(zhí)行它的功能。
開發(fā)者開發(fā)了某個軟件,就像編寫了一本字典,手冊或教材。開發(fā)者通過軟件教育或指導用戶應當/可以如何去完成某項任務,而用戶可以執(zhí)行其中的說明。
但用戶不會親自去閱讀某個軟件的二進制表示,因為計算機會代勞。但我們應當注意到,當你在使用一臺計算機時,它的設備和處理器構(gòu)成了你的身體,感官和思維的延伸。從而“使用CPU”查閱軟件的二進制代碼,和“使用電子顯微鏡”觀察微觀事物并沒有實質(zhì)上的區(qū)別:你并沒有真的看到代碼,實際上你也沒有真的看到微觀結(jié)構(gòu),是電子看到了它,電子顯微鏡將電子束的觀察“重新解釋并呈現(xiàn)”為你能夠理解的形式。而“運行軟件”就是一個“重新解釋并呈現(xiàn)”的過程。
不過這只是軟件的一個側(cè)面。因為當我們在談論軟件時,我們談論的通常并不是它“死”的,在存儲設備中的狀態(tài)。我們談論的是它“活”的狀態(tài),是當軟件在設備中運行時,它的“運行實例”。某個軟件的“某一個運行實例”和這個軟件的“軟件程序”本身并不相同。運行實例是具體于某個設備,某個任務,某次運行的,是抽象知識的具象化?!耙淮芜\行實例”就好比是“一次查字典”,它是存儲在字典當中的死知識的具象化。
但這種具象化是特定于設備,特定于任務,并且最終來說,也總是特定于用戶的。
在某個瞬間,用戶的靈魂與軟件重疊。于是,長眠于代碼中的知識死而復生,作為運行實例短暫地存活,并成為了用戶生命歷程的一部分。
也就是說,作為“運行實例”存在的軟件,它是且只能是作為用戶的一部分才得以存在的。正如前文的類比,“用戶運行軟件就像讀者參照手冊”,讀者可以脫離手冊自由發(fā)揮,用戶也可以任意操作軟件的運行實例。用戶可以暫停,隨意修改數(shù)據(jù),然后繼續(xù)執(zhí)行,或者存儲*或銷毀它。用戶是“運行實例”的主導者,就像讀者是“查手冊”的主導者。雖然說,因為現(xiàn)代電子計算機和軟件系統(tǒng)的極端復雜性,用戶想要真正掌握主導需要大量的知識,雖然用戶正在失去對它的主導能力,但我們必須要強調(diào),這個過程無論如何都只能是脫胎于用戶的,因而它無論如何都是用戶的一部分。
*:?https://criu.org/Main_Page
*:?https://podman.io/getting-started/checkpoint
那么,我想有些事的“價值判斷”應當是不言自明的。但是有一點需要強調(diào),這起事件的重點并不是“利用漏洞”,而是“不知情不同意”?!袄寐┒础笨梢允峭獾?,“不利用漏洞”也可以是不知情不同意的。而進一步的,“不允許利用漏洞”同樣可以是不被同意的。
軟件是知識,記載關(guān)于如何“利用漏洞”的書籍本身并不是必然是錯的。然而,故意在手冊中寫下不利于讀者的條目,利用讀者的無知傷害讀者,故意在軟件中包含不利于用戶的代碼,利用用戶的無知傷害用戶,這是錯的。
因此,
我認為“利用漏洞”的“不知情不同意”相比“不利用漏洞”的“不知情不同意”并不更加惡劣。因為就其對用戶的傷害而言兩者是相當?shù)摹?/p>
我認為任何“不允許利用漏洞”的措施,如果這實際上會進一步剝奪用戶的主導能力,那么無論是為了將“利用漏洞”的“不知情不同意”變?yōu)椤安焕寐┒础钡摹安恢椴煌狻?,或者出于任何其他目的,比如所謂的“安全”,這種措施都不存在任何正當性可言。
沒錯我說的是iOS app store以及某些android軟件的root檢測。當然我不會說root檢測完全是不好的因為如果真的有用戶在不知情的情況下被安裝后門,這至少能讓用戶知道。但root檢測應當提供繞過選項,也就是“我機器是我自己root我自己知道你不用管”的選項。
那么......
我們還沒有討論“服務器軟件運行實例”。既然“運行實例”是用戶自身的一部分,那么“服務器軟件運行實例”自然也是服務提供者的一部分,所以我們看似在討論軟件,實際上我們應當討論的是參與方,也就是“提供者”和“客戶”。所以說,“雖然我不小心寫了個漏洞但你不能利用這個漏洞傷害我”,這是成立的。就比如在無人的攤販前盜竊依然是盜竊,雖然它就好像是在歡迎你來偷一樣,但這依然是盜竊。
注意這里使用“客戶”(clients)而不是“用戶”(users),因為“提供者”同樣是用戶。在下文中“客戶”可以視為與“最終用戶”含義相近。
但是這里有一些問題,比如說,“什么叫傷害”。會非常微妙。
比如首先客戶端軟件是一種知識,它指導客戶如何與服務器軟件通信。那么顯然僅僅是使用第三方客戶端在任何意義上都不可能構(gòu)成對服務提供者的傷害。反過來說,“你必須用這個和我玩,不然我就不和你玩了”,如果提供者具有壟斷地位,那么這顯然是對客戶的傷害。比如某個處于壟斷地位的IM服務提供者,如果強制所有客戶必須使用某個軟件,甚至封禁使用第三方客戶端的客戶賬號,這當然......我們所有人都知道這在客戶看來是怎么樣的。
但反過來說,能構(gòu)成對服務提供者的傷害的,是沒有按照服務器所預期的,或者雙方所約定的方式與服務器通信。當然這里有很多例子,針對服務器的攻擊基本上都是通過構(gòu)造“非預期的”請求,或令服務器軟件進入“非預期的”狀態(tài)來造成服務器軟件的“非預期的”行為。而“非預期”行為的發(fā)生便為“攻擊者所期望的行為”制造了機會。那么如果某個第三方客戶端與服務器通信的方式是“非預期”的,而尤其如果這種方式是“故意”的,這就是故意的傷害行為了。
但在此基礎(chǔ)上服務提供者是應當承擔更多義務的,因為是服務提供者在主動提供服務,服務本身也是完全由提供者定義,因此提供者天然處于優(yōu)勢。提供者應當明確說明預期的通信方式,從而客戶可以自行判斷出自己正在意圖進行的通信是否是提供者所預期的。只有在事先做好約定的前提下,當意外或攻擊發(fā)生時,提供者才有資格指責對方?jīng)]有遵守協(xié)議。
然而如果協(xié)議本身就是在傷害客戶,那么按照習慣其中的不公平條款應被認為是自始無效才對。
如果是在多方的情況下,從提供者-客戶協(xié)議中我們可以自然引申出一個“多方協(xié)議”或“社區(qū)規(guī)則”,比如多人游戲中對作弊的定義和態(tài)度。多方協(xié)議應當是在所有參與方之間共同達成的,比如多人游戲的多方協(xié)議可以是具體于對局的。比如所有參與方都贊同不限制在其他對局中可能被認為是作弊的行為的的電子游戲?qū)种?,這些行為就是合理的。同樣的,所有參與方都贊同以極端手段檢測作弊的對局中,極端手段就是合理的:因為參與者不僅對別人采取了手段,這種手段也會施加于自身。
社區(qū)規(guī)則也包括coc和合規(guī)性問題。但是我認為這里有一個前提是這個協(xié)議依然是“多方”的。服務器軟件代表提供者一方,但是社區(qū)不是提供者一方的社區(qū),那么合規(guī)性以及合規(guī)性風險當然不應該是提供者一方的事情。社區(qū)的每一個參與方都應當為自己的合規(guī)性負責。畢竟由提供者代行合規(guī)性是一種僭越......嘛,這是另一個問題。
社區(qū)和服務器軟件當然是兩回事,服務提供者通過服務器軟件向社區(qū)提供承載服務,社區(qū)是通過這個承載服務所建立的用戶(提供者也可以是社區(qū)成員)關(guān)系,結(jié)構(gòu)和內(nèi)容。
提供者-客戶關(guān)系是關(guān)于如何使用服務器軟件的,而社區(qū)規(guī)則是關(guān)于社區(qū)成員之間的。如果我們的討論僅限于服務器軟件,那么社區(qū)是和服務器軟件完全沒有關(guān)系的,因為服務器軟件僅在于提供者-客戶雙方,客戶將這個關(guān)系用來做什么事是和服務器軟件本身無關(guān)的。