Chromium Chronicle מס' 15: הגבלת החשיפה של היעד

פרק 15: מאת Joe Mason במונטריאול, PQ (נובמבר 2020)
הפרקים הקודמים

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, שפועל כחלק של כל גרסת build של 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>.

משאבים