第十六章 代碼寫不出來就嘗試白嫖吧

投票推薦 加入書籤 小說報錯

  夜晚八點的芝加哥正是街頭混混和醉漢們最活躍的時候,遠處時不時地傳來幾句破嗓子的叫罵聲和忽遠忽近的刺耳警笛。

  但這些南區特有的喧囂,似乎都被阻擋在了這間狹窄破舊的出租屋之外。只剩下深秋刺骨的寒風裹挾著枯葉,時不時地拍打著那扇漏風的破木窗戶,發出令人牙酸的「嘎吱」聲。

  屋裡沒有開主燈。唯一的光源,就是書桌上那台散發著幽藍光芒的廉價顯示器。

  楊堅整個人幾乎都陷進了那張掉皮的二手辦公椅里。屏幕的冷光打在他有些疲憊卻異常專注的臉上,映出那雙布著幾根血絲的黑白分明的眼睛。他手裡端著一杯早就涼透的速溶咖啡,機械地抿了一口苦澀的殘渣,隨後煩躁地放下馬克杯,伸手用力抓了抓有些凌亂的頭髮。

  在電腦桌的最邊緣,鮑里斯給的那二十台成色不錯的二手iPhone正靜靜地躺在塑膠袋裡,完全被主人無視了。

  他並沒有急著開工。剛剛到手的六百美金現鈔還安安穩穩地揣在夾克內兜里,上個月拖欠的房租已經有了著落,眼下的溫飽危機暫時宣告解除。

  既然兜里有了這層厚實的現金緩衝墊,那袋子待破解的手機也就從續命的氧氣瓶變成了隨時可以提現的定期存款。他完全沒必要像個被高利貸逼債的倒霉蛋一樣,連夜趕工去換取明天的口糧。

  他現在有更充裕的時間和精力,去死磕那個真正能讓他在這片資本叢林裡撕開一道口子的東西。

  楊堅的視線重新聚焦在屏幕上,那裡正密密麻麻地滾動著一段讓他死活跑不通的 Java代碼。

  他正在全神貫注地嘗試復現那個在後世足以讓全球網絡安全界引發大地震的核彈級漏洞——Log4j JNDI注入漏洞。

  具體的復現思路他腦子裡門兒清,但問題就卡在了「構建惡意的 LDAP響應服務」這最關鍵的一環上。

  「思路絕對沒問題,但特麼的這底層的協議怎麼就這麼難搞……」楊堅盯著屏幕上瘋狂報錯的終端,無奈地嘆了口氣。

  在目前的年代,根本沒有後世那些一鍵生成惡意服務端的神器。他必須從零開始,硬搓一個能糊弄過 Java虛擬機的微型 LDAP伺服器。可無論他怎麼修改報文的字節序,目標機器就是死活不加載他的惡意代碼,不是報序列化錯誤,就是直接丟棄請求。

  閉門造車了兩天,進展不能說是步履維艱,只能說是一動不動。他現在看著屏幕上那些死活不聽指揮的底層代碼,感覺這玩意兒簡直比南區街頭最爛的酒鬼還要不可理喻。

  楊堅也嘗試了上網求助。畢竟在2011年左右,無論是國內還是美國的網際網路,技術論壇的氛圍都極其真誠火熱。沒有割韭菜的付費教程,全是樂於分享的技術大牛。

  為了防止被人順藤摸瓜,他極其謹慎地給這個問題套上了一層偽裝,將其包裝成了一個「關於遺留老舊系統網絡兼容性測試」的純技術求助帖,發到了諸如 Stack Overflow早期板塊以及幾個知名的黑客與開發者 BBS上。

  發完帖子後,他就像個等開獎的賭徒,一邊啃著隔夜的冷披薩,一邊每隔五分鐘就狂按一次 F5刷新頁面,期待著哪位頂著二次元頭像的隱世大牛能從天而降,甩出一段神級代碼直接打通他的任督二脈。

  然而,現實往往比 Bug還要骨感。

  論壇里雖然潛伏著無數大神,但並不是每一個帖子都能得到神仙下凡般的指點。楊堅問的這個問題實在太偏門、太底層了——「如何不依賴標準庫,使用純 Socket通信手動構造極其非標準的 LDAP ASN.1響應報文,去迎合 Java命名接口(JNDI)的底層解析規則」。

  這種不僅是在鑽牛角尖、甚至看著還有點像在搞破壞的底層黑魔法,發出去猶如石沉大海。好不容易等來幾個回復,點開一看,全能讓人氣得腦充血。

  一樓的架構師警察:「樓主你這純屬是陷入經典的 XY問題了。你為什麼要這麼幹?直接 import javax.naming.*用現成的 API調標準庫不香嗎?奉勸一句,別閒著沒事重複造輪子。」

  二樓的吃瓜群眾:「這陰間需求看著怎麼這麼像在寫木馬或者搞滲透?樓主不會是哪個大學的本科生,在上網絡安全課想騙論壇老哥幫你寫期末大作業吧?」

  三樓和四樓的論壇水軍:「純純的底層黑魔法,不明覺厲,幫頂。」、「沙發沒了,搬個小板凳蹲個大佬解答,先 Mark為敬。」

  最離譜的是五樓,只留下了極其敷衍的四個字:「關機重啟下。」


  看著滿屏這些讓人吐血的回覆,楊堅一口氣差點沒倒上來。

  這種感覺極其憋屈。就像是你手裡明明捏著一張能造出殲星艦的圖紙,跑去五金店問老闆「怎麼把這兩根引信接起來不短路」,結果老闆像看神經病一樣看著你,語重心長地勸你「買個一塊五的成品雙控開關不好嗎」。

  偏偏他還根本沒法跟這幫人解釋!他總不能在帖子裡大喊「老子在挖一個價值不菲、能讓全網癱瘓的零日漏洞」吧?那估計第二天 FBI就會踹開他這間漏風出租屋的破門。

  「靠一群水友,黃花菜都涼了。」楊堅揉了揉發脹的太陽穴,果斷關掉了滿屏廢話的瀏覽器。

  倒霉透頂的楊堅只能把目光投向了線下。

  兩天後,芝加哥大學計算機系的階梯教室。

  推開大門的那一刻,一股混合著廉價披薩、高濃度功能飲料和電子元件的奇特味道撲面而來。這就是由芝大計算機系牽頭舉辦的一場開放式Tech Meetup(線下技術沙龍)。

  楊堅站在後排,看著這亂糟糟卻生機勃勃的現場,心裡忍不住生出幾分感慨。

  他對於當前這個時代的技術現狀與開源精神有了一種具象化的理解。這真的是網際網路最後的黃金時代——智慧型手機剛剛普及,大廠的技術壟斷和寡頭互聯的高牆還未築起。在這裡,人們不談論股票期權,不談論流量變現,只談論如何用代碼改變世界。

  就在這時,一陣激烈的爭論聲打斷了他的思緒。

  不遠處的一個圓桌旁,一個留著胡茬、身材高大的丹麥裔青年正揮舞著手臂,用極具煽動性的語氣大聲批判著 Java體系的臃腫:「你們這些學院派就是被 Java那些繁文縟節洗腦了!未來屬于敏捷開發!Ruby on Rails才是 Web架構的終極形態,它能讓你們少寫哪怕一萬行沒用的狗屎代碼!」

  楊堅挑了挑眉。他一眼就認出了那個年輕氣盛的傢伙——大衛·海涅邁爾·漢森(DHH)。

  這位不僅是芝加哥本地明星軟體公司 37signals(後來的 Basecamp)的聯合創始人,更是大名鼎鼎的 Ruby on Rails框架的締造者。在2011年這個時間節點,他正處於技術聲望的最巔峰,是無數開發者眼裡的叛逆偶像。

  不過,作為一個從後世穿越來的老碼農,楊堅看著這位被眾人眾星捧月的大佬,心裡只覺得有些好笑。

  他在心裡默默吐槽了一句:「盡情狂歡吧,DHH大佬。再過個幾年,等單體架構被移動網際網路時代的恐怖流量撐爆時,這幫現在把你當神拜的極客們,就會一邊瘋狂掉頭髮,一邊連夜把你的代碼全拆了,老老實實用 Go語言和微服務重構。而且誰能想到,你這個現在的技術潮流引領者,十幾年後會變成一個天天在推特上瘋狂對線、甚至逆版本而動,扯著嗓子喊要把公司從雲端全搬回物理機房的暴躁刺頭呢?」

  歷史的局限性總是這麼奇妙且諷刺。

  不過,楊堅對這場註定要被時代翻篇的框架之爭沒半點興趣。他今天可是帶著極其明確的目的來的——白嫖這滿屋子的高智商大腦。

  找個安靜的角落一個人死磕?那純屬腦子進水。在南區混了這麼久,楊堅早就把臉皮練得比防彈衣還厚。

  他走到餐檯前,極其自然地順了一角免費的冷披薩和一聽可樂,一邊啃著,一邊像個極其圓滑的交際花一樣,開始在各個討論圈子邊緣遊走試探。

  聽到聊前端 UI和網頁設計的,他腳都不停直接略過;聽到聊資料庫表結構的,他停下聽兩秒,發現沒幹貨後立刻走人。

  終於,在會場偏僻的一角,他鎖定了一個由幾個髮際線堪憂、穿著格子襯衫的老哥組成的硬核圈子。這幫人正在白板前激烈地討論著企業級 Java應用底層的網絡通信和分布式目錄服務(LDAP)。

  「來活了。」

  楊堅眼睛一亮,毫不客氣地湊了過去,站在最外圍邊喝可樂邊旁聽。

  他沒有一上來就傻乎乎地拋出自己的 Bug,那樣只會被當成伸手黨趕出去。他像個耐心的獵手一樣潛伏著。當其中一個胖子工程師抱怨 Java原生的 Naming接口在處理複雜網絡環境時太過臃腫死板時,楊堅精準地抓住了時機。

  他咽下嘴裡的披薩,極其自然地插了一句嘴,用幾句後世雲原生架構里極其精闢的接口解耦與輕量級通信思維,瞬間把那胖子的話題拔高了兩個維度。

  這種來自未來十年的降維打擊,立刻讓圈子裡的幾個工程師對他刮目相看。幾句專業黑話一交鋒,大家瞬間默認了這個年輕的亞洲面孔是自己人,原本封閉的小圈子自然而然地給他讓出了一個位置。


  見火候差不多了,楊堅裝作不經意地嘆了口氣,拋出了自己準備已久的魚餌。

  「說起底層協議,各位老哥,我最近接了個極其陰間的遺留系統測試活兒,頭疼得很。」楊堅皺著眉頭,拋出了那個在論壇上無人問津的問題,「你們說,如果完全拋棄標準庫,只用純 Socket通信,我該怎麼手動構造一段極其非標準的 LDAP ASN.1響應報文,去強行騙過 Java JNDI接口的底層校驗邏輯?」

  此話一出,剛才還聊得熱火朝天的小圈子瞬間安靜了下來。

  幾個資深老哥面面相覷。這個問題實在太偏門、太野路子了,簡直就像是放著好好的正門不走,非要問「怎麼用一根鐵絲把金庫底下的下水管道給撬開」。

  「夥計,你這思路也太……劍走偏鋒了。」那個胖子工程師撓了撓快要禿頂的腦袋,表情有些尷尬,「誰沒事會去硬搓 ASN.1的底層字節序啊?那玩意兒簡直不是人看的。你為什麼不直接……」

  「你陷入思維誤區了,年輕人。」

  胖子的話還沒說完,一個低沉、略帶點傲慢的男中音突然在楊堅身後響起,直接打斷了這場討論。

  楊堅轉過頭,看到一個穿著得體的粗花呢西裝、帶著半框眼鏡的中年白人男子不知何時站在了這個小圈子的外圍。男子的目光越過眾人,直接鎖定了楊堅,眼神里透著一種學術權威的從容與銳利。

  「你一直在嘗試構建一個完整的、符合規範的 LDAP目錄服務報文去迎合它,」中年男人推了推眼鏡,語氣裡帶著一絲智商優越感十足的微笑,「但你的目的如果僅僅是為了讓 Java客戶端通過 JNDI下載特定的 Reference對象,那你根本不需要遵循完整的 LDAP握手協議。」

  楊堅愣了一下,腦子裡仿佛有一道閃電劈過。

  「你的意思是……」

  「我的意思是,Java的底層 NamingManager極其愚蠢。」男人繼續說道,「它在解析 LDAP響應時,只認三個核心屬性:javaClassName、javaFactory和 javaCodebase。你只需要寫一個最簡單的 Socket監聽埠,直接把包含這三個屬性的硬編碼字節流強行塞給客戶端,根本不用管其他的協議規範,它就會乖乖去下載你的代碼。」

  一語驚醒夢中人!

  楊堅猛地一拍大腿。對啊!他之前一直想用正規的手段去回復請求,卻忘了在黑客的邏輯里,只要結果達到了,中間的協議規範完全可以被暴力閹割和偽造!

  這老小子的計算機底層知識極其紮實,眼光毒辣得可怕。

  「太妙了……非常感謝!」楊堅飛快地在紙上記下思路,轉過頭真誠地道謝,「您是芝大的教授嗎?」

  「你可以這麼叫我。」中年男人極其享受楊堅這種恍然大悟的崇拜眼神,他伸出手,「我叫赫斯特(Professor Hearst)。我是專門負責評估……『特殊人才』的。我看你邏輯敏銳又長得年輕帥氣,根本不像是那些死讀書的本科生。我手裡正好有幾個非常核心的校外項目,不知道你有沒有興趣跟我去辦公室詳細聊聊?」

  聽到「赫斯特」這個名字,楊堅原本準備握手的手在半空中極其細微地停頓了半秒,隨後極其自然地握了上去。

  赫斯特教授?

  楊堅的腦子裡迅速過了一遍《無恥之徒》的原著劇情。那個在第一季里代表教育考試服務中心(ETS),把替人代考 SAT瘋狂作弊的利普當場抓獲,不僅沒有報警,反而利用利普的把柄,威逼利普這個天才少年成為他私人項目免費勞動力的那個衣冠禽獸老狐狸?!

  難怪這老傢伙的計算機和邏輯學知識這麼豐富,他在原著里就是個打著惜才的名義,專門在各大高校里發掘並壓榨天才的不良導師。

  看著赫斯特教授那副看似伯樂、實則要把他生吞活剝的偽善笑容,楊堅心裡冷笑了一聲。作為一個深諳職場潛規則的老鳥,他太懂這種「上趕著的買賣」背後藏著怎樣的陷阱了。

  赫斯特現在看中他,只是因為他展現出了一點小聰明。如果他現在兩手空空、毫無背景地跟著去了辦公室,在絕對的身份和資源壓制下,他頂多只能淪為赫斯特手裡一個廉價甚至免費的底層牛馬。

  未來或許可以利用這個老狐狸的資源進行合作,但絕對不是現在。絕對不能是在他還沒有任何實質性籌碼、沒有真正證明自己不可替代性的時候。

  「久仰大名,赫斯特教授。您剛才的點撥簡直是一針見血。」


  楊堅抽出手,臉上掛著極其得體、甚至透著幾分職場精英般圓滑的微笑。他並沒有急著答應,而是用一種不卑不亢的語氣婉拒道:

  「您的項目聽起來非常誘人。不過實在不巧,我最近手裡正接了幾個商業客戶的底層架構重構項目,正處於趕工交付的階段。我這人有個原則,既然接了活兒,就不想因為精力分散而砸了自己的招牌,更不想因為狀態不好而敷衍了您這麼重要的項目。」

  赫斯特那雙藏在半框眼鏡後的眼睛微微眯了起來。他原本以為這個衣著寒酸、在角落裡死磕底層邏輯的亞裔年輕人,會像那些渴望得到學術大佬賞識的窮學生一樣,對他拋出的橄欖枝感恩戴德。

  但他沒想到,這小子拒絕得如此絲滑,而且話術老練,話里話外都在暗示「自己是個有客源、有商業價值的工程師」。

  「原來如此,那真是太遺憾了。」赫斯特眼裡的那種高高在上收斂了幾分,多了一絲真正的審視與興趣。

  「不過,我希望能留下您的聯繫方式。」楊堅恰到好處地拋出了一個未來的魚餌,「等我把手頭的活兒徹底結清,並且把我剛才構思的這套『非標準底層協議』做成一個完美的成品時,我會親自去您的辦公室拜訪。到那時候,我想我們能聊的合作,一定會比現在有趣得多。」

  聽到這番滴水不漏且充滿野心的話,赫斯特終於收起了那副偽善的笑容,嘴角勾起一抹滿意的弧度。

  「很好。我喜歡清楚自己價值的年輕人。」赫斯特從西裝內兜里掏出一張名片,遞了過去,「這是我的私人辦公室電話。我期待看到你的成品。」

  「一定不會讓您失望。」

  楊堅雙手接過名片,看都沒看一眼就塞進了口袋裡。他沖赫斯特和那幾個工程師揮了揮手,隨後在一眾開發者的爭論聲中,步伐從容地走出了階梯教室。

  走出大樓,迎面吹來的芝加哥冷風讓楊堅的頭腦徹底清醒,心情卻是一片大好。

  這波芝大線下沙龍,來得簡直太值了。

  不僅白嫖到了最關鍵的底層技術拼圖,打通了卡殼兩天的邏輯死結,竟然還順手搭上了赫斯特這隻老狐狸的線。這老登雖然人品不咋樣,但作為芝大的資深教授和項目負責人,他手裡掌握的學術資源和行業人脈絕對是貨真價實的。

  楊堅隔著夾克布料,摸了摸口袋裡那張名片,眼神變得深邃而冷峻。

  現在不合作,是因為自己是個還沒上牌桌的無名小卒,只能被當成廉價勞動力。但等他回去把 Log4j這個重磅炸彈搓出來,在整個軟體安全圈裡揚名立萬時,合作蛋糕怎麼分,可就不能光這老狐狸說了算了。

章節目錄