Chromium Chronicle #15:限制目標瀏覽權限

第 15 集:作者:臺北市中正區的 Joe Mason (2020 年 11 月)
上一集

Chrome 是涵蓋許多子系統的大型專案,開發人員常會找到程式碼 為某個元件撰寫而成,在其他地方也很實用,但或許會隱藏 以及為了安全起見,請限制外部人士存取危險功能。 例如,根據特定效能需求調整的自訂函式:

// Blazing fast for 2-char strings, O(n^3) otherwise.
std::string ConcatShortStringsFast(const std::string& a, const std::string& b);

限制存取的方式有好幾種。GN 瀏覽權限規則停止程式碼 或排除在元件外。預設目標為 所有參與者都能看到,但您可以修改以下內容:

# In components/restricted_component/BUILD.gn
visibility = [
  # Applies to all targets in this file.
  # Only the given targets can depend on them.
  "//components/restricted_component:*",
  "//components/authorized_other_component:a_single_target",
]
source_set("internal") {
  # This dangerous target should be locked down even more.
  visibility = [ "//components/restricted_component:privileged_target" ]
}

瀏覽權限宣告會透過 gn check 進行驗證,而該宣告會做為 所有 GN 版本提供的容器

另一個機制是 DEPS include_rules,這會限制標頭檔案的存取權。 每個目錄都會沿用父項的 include_rules,而且可以修改這些目錄 寫入自己的 DEPS 檔案外部納入的所有標頭檔案 目錄必須套用 include_rules 的允許,

# In //components/authorized_other_component/DEPS
include_rules = [
  # Common directories like //base are inherited from
  # //components/DEPS or //DEPS. Also allow includes from
  # restricted_component, but not restricted_component/internal.
  "+components/restricted_component",
  "-components/restricted_component/internal",
  # But do allow a single header from internal, for testing.
  "+components/restricted_component/internal/test_support.h",
]

為確保這些依附元件正常運作,請進行新增目錄的變更 「include_rules」必須經過該目錄的 OWNERS 核准。否 必須獲得核准才能使用 include_rules 限制目錄!你可以 確保每次變更元件時 都記得不使用某些 加入 include_rule 標頭即可出價。

include_rules會送交預先提交,因此您不會看到任何 錯誤。如要在不使用 的情況下測試 include_rules 上傳中,執行 buildtools/checkdeps/checkdeps.py <directory>

資源