介紹
Broken Authorization(也稱為破壞通路控制或特權更新)是由于用于指定使用者通路特權的授權檢查的無效而産生的一系列缺陷的簡稱。
根據使用者指定的角色和相應的特權,在經過設計和實作的授權架構中允許或拒絕不同的使用者通路各種内容和功能。例如,在web應用程式中,授權主要用于身份驗證和會話管理。然而,跨動态系統設計授權就比較複雜了,并且可能會随着應用程式的發展而導緻各系統的機制不一緻:身份驗證庫和協定發生變化、使用者角色發生變化、新使用者的注冊、老使用者登出,使用者權限删除等等。通路控制設計不僅僅是由技術決定的,而是由人決定的,是以發生錯誤的可能性很高,而且一直存在。
這種性質的漏洞可能會影響很多現有的web應用程式、資料庫、作業系統和其他依賴于授權控制的技術基礎設施中的各類軟體。
影響及危害
攻擊成功後黑客可能能夠通路未經授權的内容,更改或删除内容,執行惡意代碼,甚至完全控制管理站點。一旦遭受到這種程度的入侵,攻擊的損失往往取決于被冒充的受害者賬号賦予的特權範圍有多大。
之前有一家名為CloudPets的玩具制造公司,他們發生的資訊洩露事件就是由于上述人的為錯誤造成的。在這案例中,沒有對授權進行控制導緻了兒童語音資訊的洩露,而且随後發生還發生勒索時間,這些語音資訊是通過雲記錄的,并直接被存儲在雲中。
場景
從使用者的角度來看,有兩大類授權控件需要考慮:
- 橫向授權控件
- 垂直授權控件
橫向授權控件繞過
橫向授權控制繞過描述了無特權使用者通路擁有同等權限的其他使用者帳戶的行為。
例如,想象一個應用程式在方法調用下遊中接受未經驗證的資料以檢索帳戶資訊。攻擊者可以很容易地修改HTTP Request中的accountId參數,用一個甚至多個其他使用者的帳戶檢索資料。
應用程式在方法調用下遊中使用未經驗證的資料來檢索帳戶資訊:
http://vulnerablexxx.com/user/account?accountId=7800001
http://vulnerablexxx.com/user/account?accountId=7800002
etc.
另外一個場景是不安全的直接對象引用(IDOR),指的是使用使用者提供的輸入直接通路對象。
垂直授權控件繞過
垂直授權控制繞過描述使用者提權通路不被允許的資料或應用。也就是說,具有特定級别特權的使用者越權通路了需要擁有更進階别通路權限(如管理級别通路權限)才能通路的資料或應用。
在本例中,攻擊者作為一個普通使用者卻浏覽到一個管理URL,在這裡需要管理者權限才能通路管理頁面。
http://vulnerablexxx.com/user/account
http://vulnerablexxx.com/admin/panel
如果應用程式不檢查會話使用者的角色是否與通路資源所需的角色比對,那麼沒有管理特權的使用者将能夠通過知道/猜測目标URL并浏覽到它來通路頁面。
如何防護
開發人員可以采取許多基本步驟來防止破壞授權控制攻擊,首先對應用程式的通路控制需求進行評估,然後根據評估結果制定适當的安全政策。這應該包括一個通路控制矩陣,明确哪些類型的使用者可以通路系統,以及這些使用者可以或不可以做什麼。使用基于角色的通路控制(RBAC)在适當的邊界上強制執行。
對于web應用程式,確定在伺服器端每個頁面和API端點上正确執行通路控制機制。使用者不應該通過請求直接通路頁面或對象來通路任何未經授權的功能或資訊。
代碼示例(JAVA)
例如,應用程式在方法調用下遊中使用未經驗證的資料來檢索帳戶資訊,導緻了水準授權繞過:
http://vulnerablexxx.com/user/account?accountId=7865000321
http://vulnerablexxx.com/user/account?accountId=7865000321
攻擊者可以修改HTTP請求中的accountId參數,僞裝成任何使用者的帳戶,發起檢索資訊請求。
防護措施
Spring
Spring Security在web和method級别都支援授權語義。可以限制哪些角色能夠執行特定的方法,這是實施垂直授權控制的好方法:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity security) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ROLE_ADMIN");
}
...
}
通過使用注釋,安全表達式也可以用于在method級别保護業務功能。@PreAuthorize和@PostAuthorize注解支援Spring表達式語言(SpEL),并提供基于表達式的通路控制:
@Service
public class AdminService {
@PreAuthorize("hasRole('ROLE_ADMIN')")
public List<Organization> findAllOrganizations() { ... }
...
}