原文地址
維護一個CSGO服務器
我曾經創建並維護了一個位於澳洲和新西蘭的CSGO社區服務器, 這個叫做InvexGaming的服務器活躍於2014年至2019年間。 得益於我們優秀的社區環境、創作內容、比賽和各種自定義的遊戲插件, 這個服務器很快就流行開來。
維護一個遊戲社區需要做很多事情,包括: *維護社區的基礎建設和服務器 *平衡社區捐贈和開銷 *添加新的內容,比如增加玩家模型、修復hitbox *自動化的VIP系統和權限控制 *為社區編寫特有的插件 *組織DDOS攻擊 *處理騷擾舉報 *統治世界
其中最單調乏味的就是識別和封禁作弊玩家。
貓鼠遊戲
不管是什麼遊戲都會有作弊玩家。作為服務器維護人員,你可以通過各種技術手段來檢測他們。 我們可以使用服務端的代碼來檢測人類玩家難以做到的行為。 我們也可以使用ValveAnti-Cheat(VAC)系統。 這個系統雖然性能堪憂,但對於明顯的作弊行為還是很好用的。 我們可以將你的系統內核用於反作弊,也可以將它用於挖比特幣(作為你的感謝費)。 好吧,我們其實沒這麼幹,但是有些反作弊軟件確實這麼做了(比如ESEA)。
這些方法都挺好的,但是在作弊/反作弊的拉鋸戰中,它們沒辦法檢測出所有的作弊行為。 作為最終手段,我們只能對全天候的CSGO遊戲記錄進行人為分析, 我們的管理員(你可以把他們視為陪審團)會對一位玩家是否作弊進行謹慎的裁決。
一旦我們抓到了一個作弊玩家,出於對競技精神的尊重,我們會將他永久封禁。 對作弊者來說,他們不喜歡被抓,但他們也不會停止作弊。 有無數次,我們解封了一些玩家後他們第二天就因為作弊而再次被封。 不過其中有一些玩家更瞭解技術,也知道一些規避封禁的基本方法。
規避封禁的藝術
一個玩家可以怎樣規避封禁呢?
封禁策略的核心是一個可以用作身份識別的信息(識別子),基於這個信息我們可以阻止你訪問服務。
在互聯網中,這個信息通常會包括你的IP地址。 IP地址由你的網絡服務商分配給你,你通過它互聯網中的其他的機器通信。 比如一個IPv4的例子可以是:198.51.100.1。
在Steam的系統中,每個玩家都需要一個Steam ID來遊玩Steam上的遊戲。 這是一個唯一的識別子,和你的Steam賬號綁定,用來在Steam的世界中識別你的身份。 一個SteamID的例子是STEAM_1:1:1111。
我們假設一個被封號的玩家的IP address是198.51.100.1,而他的Steam ID是STEAM_1:1:1111。 我們會把他的封禁記錄存儲到數據庫中,然後把他踢出服務器。 這樣一來,他下次加入服務器的時候,他的IP和Steam ID就無法通過封禁檢測了。
要逃過這樣的封禁,玩家可能會切換到另一個遊戲賬號。 這個新賬號的Steam ID(比如STEAM_1:1:2222)和他被封禁的Steam ID不同, 但是這都在我們的反作弊之神的計劃之中。 如果一個玩家有不同的Steam ID但是他的IP已經被封禁,系統會再次封禁他, 並將這個新的Steam ID關聯到之前的封禁記錄上。 這其實是一個建立玩家指紋的過程,我們現在知道這個玩家與兩個Steam ID和一個IP地址關聯。
如果反過來,這個玩家決定使用VPN來更換他的IP地址,那麼他的新IP地址 (比如203.0.113.60)無法匹配到被封禁的IP。 不過和之前一樣,如果一個玩家有不同的IP地址,但是他的Steam ID已經被封禁, 反作弊系統依然會再次封禁他,並將這個新的IP地址關聯到之前的封禁記錄, 進一步完善這個玩家的指紋。
給我等一下
要是他們同時更換了IP地址和SteamID呢?
好吧,這招確實不錯。
在這種情況下,對服務器來說這是一個全新的玩家,我們沒有任何辦法將他和已有的封禁記錄關聯起來。不幸的是,這意味著他可以為所欲為,而一旦他們再次被封禁,他們只需要再次更換IP地址和Steam ID就可以繼續逍遙法外。
為了緩解這種情況,我們可以維護一個VPN和它所有IP地址的列表,但是這將是一個非常枯燥耗時的工作,所以我們的管理團隊在討論之後對這個方案興趣寥寥。
你可能會說,作弊者早晚會用盡他的IP地址和Steam ID的。事實上,他們不會用盡的。 我們的分析表明,我們最臭名昭著的作弊者在世界各處有幾乎無限的IP地址和超過87個已經購入CSGO的Steam賬號。
用IP作為指紋會出問題
我們需要記住一點,Steam ID是唯一的,但IP地址不是。 我們曾經遇到一個情況,一對兄弟想要在我們的服務器玩遊戲,但是其中一個會作弊。 結果就是兩個人都被封號了,因為他們兩個人的賬號被關聯在了一起。 其中一個玩家聲稱「他無法控制自己的兄弟,所以他不應該因為兄弟的行為被懲罰」。
是的,他說的沒錯。
另一個問題是類似大學這樣的機構會使用共享網絡。 有時候一群玩家會使用他們大學的單個出口IP地址。 如果其中一個人因為作弊被封號,所有其他玩家都會被標記為作弊,他們的Steam ID和他們家裡的IP地址也都會被誤傷。
我們做了額外的系統來規避這種情況,但整體上我們還是建議大家不要通過自己不信任的網絡進行遊戲。
IdentityLogger
讓我們面對現實
我很嚴肅且並無不敬地說一句,作弊者都是一些傻*。他們現在是傻*,他們會一直是傻*。 也許還會生出很多傻*小孩。
我始終搞不懂你為什麼要在遊戲中作弊,這不是一種極其無聊的時間浪費麼? 不論我遊戲水平優劣,對我來說最大的樂趣就是和其他人競技,努力提升自我,最終獲得自豪感和成就感。
2017年初,我們的服務器中的封禁規避問題越發嚴重。 這大大增加了管理員們的工作負擔,因為他們需要持續地對遊戲記錄進行人工審查,這些工作不但耗時,而且極其無聊。我至今都非常感激管理員們在我們社區中的辛勤勞動。
那天,我坐下來,拿出我的橡皮鴨,戴上降噪耳機,想通過「工程學」來抓到所有的作弊玩家。
應對SteamID和IP地址的同時變化
我們面對的核心問題就是如何處理Steam ID和IP地址的同時變化。 咋看之下似乎無從下手,因為我們沒有別的識別子可用了。 在這個階段我做了很多頭腦風暴和數據分析。 我曾經是一個SourceMode社區的活躍成員,對於CSGO遊戲的二進制文件進行逆向工程可以說是得心應手了。於是有一天我覺得我可以從遊戲的內置瀏覽器下手。
CSGO在遊戲內提供了一個基礎的網頁瀏覽器(不是Steam的內置瀏覽器(overlay browser)),當有人加入服務器時,服務器維護人員可以通過這個瀏覽器來顯示一些信息(MOTD,message of the day)。我們把它叫做VGUI瀏覽器。
這個瀏覽器通常會被服務器維護人員用來向新加入的遊戲玩家顯示服務器守則。 有趣的是,服務器維護人員可以強行用它在玩家的屏幕上打開任何網站。 這個瀏覽器的窗口甚至可以被隱藏,這意味著你可以用它打開一個YouTube視頻然後突然播放一段背景音嚇玩家一跳。 VGUI瀏覽器是通過Steam的cookie提前認證的,所以你可以通過它登陸任何Steam的域名, 比如steamcommunity.com。 服務器維護人員還可以發送一段JavaScript代碼並在瀏覽器客戶端執行。 是的,你沒看錯。就是這個引發了2017年Steam的提權問題,那次事件中服務器維護人員可以利用這個特性劫持玩家的認證信息。不過那就是另一個故事了。
Cookies🍪
我再重複一次,VGUI瀏覽器是通過Steam的cookie提前認證的,這意味著它原生支持cooke。 Cookies被設計用來持續存儲通訊會話信息,那要是我們在每一個玩家訪問服務器的時候都把他們對我們域名的cooke保存下來呢?
🔔🔔🔔 就是你了!🔔🔔🔔
通過測試我們知道,一旦我們保存了VGUI瀏覽器的cookie,即使關閉和重啟CSGO這些cookie依然有效。而且VGUI瀏覽器好像沒有強制設置cookie的失效時限。現代化的瀏覽器比如Chrome會強制cookie在一段時間後失效,但是對VGUI瀏覽器來說,一旦保存了cookie,就算過了十年也沒問題。
另一個方便的特性是VGUI瀏覽器可以被完全隱藏。就是說服務器完全可以悄無聲息地強制客戶端訪問我們的網站,然後我們可以生成玩家的指紋信息,並保存一些cookie。 這些操作完全可以在玩家看不到的瀏覽器窗口中進行。隱秘而致命。
我們還發現,這些cookie的數據文件被保存在玩家電腦的Steam安裝路徑中。 這很重要,因為這意味著大部分作弊者永遠不會發現如何繞過它。 因為他們自己不會主動去刪除這個文件,而瀏覽器和遊戲也沒有任何清理cookie的功能。
很好,我們已經找到了一個方法來悄悄保存玩家的cookie,於是我們現在有了第三個識別子來協助我們生成玩家的指紋信息了。這個識別子——我們稱之為TrackingID——和玩家的安裝路徑綁定。 現在,一個玩家想要假裝自己是「新玩家」,他需要更換Steam ID,IP地址,以及自己的Steam安裝路徑。如你所想,沒人會想到去做第三點。
(整個玩家系統被稱為IdentityLogger,它是被開源在Github。此處我略過了原文中對的實裝細節。)
2017年的封禁浪潮
在開發並測試了這套解決方案之後,我們在2017年2月將它部署到了GamingCSGO服務器上。 結果好得令人震驚。
在我們每天封禁作弊者的數量圖中,我們立刻就注意到了那個巨大的尖刺。 有一些長期以來被社區信任的知名成員被曝出他們其實有一些用於作弊的小號。 還有一些作弊者私下聯繫到我,問我為什麼他們更換了Steam ID和IP地址為什麼還是被檢測出來了。 其他服務器的一些維護人員對這套系統很感興趣,甚至希望能夠購買, 但我只把這套方案分享給了一個位於英國的服務器的維護人員,因為我完全信任他, 而這套方案的廣泛傳播會導致它迅速的失效。
這是一段高光時期,其中的每時每刻都令人沉醉。我們的社區贏得了「難以作弊」的美名, 隨之而來的是作弊者和對於作弊者的舉報大幅減少。而最妙的部分是沒人知道我們是怎麼做到的, 我們的管理員把它視作最高機密守口如瓶。我們其實應該申請個專利的。
一旦作弊者知道了我們生成指紋信息的方法,他們就可以通過刪除cookie文件來輕鬆繞過這套系統。 但是我可以很高興地說,這套方案一直如期運行,直到2017年十月Valve出於安全性的考慮徹底移除了VGUI瀏覽器。在此之後我才能夠將它公諸於世並開源代碼。
直到很多年之後,我依然對這套方案的優秀效果而相當自豪。(全文完)