age verifier 可在任何網站上自動將您的帳戶驗證為成年人,使用 k-id
由 xyzeva 和 Dziurwa 開發,感謝 amplitudes (先前的工作)
年齡驗證器目前已失效,我們正在努力修復,並將在完成後更新此頁面。
Discord 使用的年齡驗證提供商 k-id 不會儲存或將您的臉部傳送至伺服器。相反地,它會傳送一堆關於您臉部和整體處理過程的元數據。雖然這對您的隱私有益 (考量到其他提供商會將您的臉部實際影片傳送至其伺服器),但對他們來說也很糟糕,因為我們可以輕鬆地將看起來合法的元數據傳送至其伺服器,而他們無法分辨其真偽。雖然過去這很容易,但 k-id 的臉部驗證合作夥伴 (faceassure) 在 amplitudes 的 k-id 驗證器發布後 (該驗證器已失效) 使其變得更加困難。隨著 Discord 決定將年齡驗證要求全球化,我們決定再次研究以查看是否能繞過新的檢查。
我們注意到的第一件事是,在比較合法請求負載和生成負載時,舊實作遺漏了加密負載 (encrypted_payload)、驗證標籤 (auth_tag)、時間戳記 (timestamp) 和初始化向量 (iv)。查看程式碼,這似乎是一個簡單的 AES-GCM 密碼,金鑰是 nonce + timestamp + transaction_id,使用 HKDF (sha256) 衍生。我們可以輕鬆地複製此功能,並在生成的輸出中創建遺失的參數。
這就是事情變得有點棘手的地方,即使完美複製了加密,我們的驗證嘗試仍然不成功,所以他們一定也在檢查實際的負載。經過一些試驗和錯誤,我們將檢查的部分縮小到預測陣列,即輸出 (outputs)、主要輸出 (primaryOutputs) 和原始數據 (raws)。事實證明,outputs 和 primaryOutputs 都是從 raws 生成的。基本上,原始數字被映射到年齡輸出,然後使用 z-score (primaryOutputs 一次,outputs 兩次) 移除離群值。還有一些其他差異:
首次發布後,k-id 的臉部掃描提供商私下為此腳本添加了補丁。然而,該補丁不足以繞過,我們成功繞過了它 (所以腳本又可以正常工作了!)。該補丁是他們開始檢查 recordedOpennessStreak、recordedSpeeds、failedOpennessReadings、failedOpennessSpeeds 和 failedOpennessIntervals 是否有效,方法是檢查值在伺服器端相互引用。
完成這一切後,我們就可以正式將我們的年齡驗證為成年人。所有這些程式碼都是開源的,並在 github 上提供,所以您可以確切地看到我們是如何做到的。