Solidity

為什麼限制管理員訪問透明代理中的回退功能?

  • March 8, 2022

在透明可升級代理合約中,有一個部分阻止管理員訪問回退功能:

   /**
    * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.
    */
   function _beforeFallback() internal virtual override {
       require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target");
       super._beforeFallback();
   }

為什麼要限制管理員訪問回退功能?這樣做有什麼特別的原因嗎?

這是因為代理合約函式和目標合約函式之間可能存在歧義。如果代理和實現中都存在一個函式,並且管理員在代理上呼叫它,你會怎麼做?在代理中處理它是有效的,但將它轉發給實現也是有效的……這可能導致帶有隱藏函式標識符衝突的離散後門漏洞,如here所述。管理員可以使用它們來離散地修改代理,或禁止使用者訪問實現功能……

因此,為了消除所有歧義並保護每個人:

所有非管理員呼叫都將被轉發,所有管理員呼叫都將作用於代理本身,並且永遠不會通過此修飾符轉發:

/**
* @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
*/
modifier ifAdmin() {
   if (msg.sender == _getAdmin()) {
       _;
   } else {
       _fallback();
   }
}

您添加的程式碼只是一個額外的安全措施,確保即使管理員從代理實現中呼叫未知函式,它也不會被轉發:管理員僅作用於代理,沒有歧義。

openzeppelin 部落格文章在這方面也提供了相當豐富的資訊。

引用自:https://ethereum.stackexchange.com/questions/123343