계: Errors

오류 및 오류 처리는 API 클래스를 나타냅니다. 오류 처리와 관련된 오류는 매우 흔하므로 따로 다룰 만한 내용입니다. "API 오용"과 마찬가지로 오류 관련 보안 취약성을 일으키는 두 가지 원인이 있습니다. 가장 흔한 것은 오류를 제대로(혹은 아예) 처리하지 못하는 것입니다. 두 번째는 (잠재적 공격자에게) 너무 많은 정보를 제공하거나 처리하기 어려운 오류를 발생시키는 것입니다.

Denial of Service: External Call

Abstract
함수가 루프 문 내에서 외부 계약을 호출하며, 이로 인해 서비스 거부 상황이 발생할 수 있습니다.
Explanation
구체적으로는 외부 계약이 호출에서 오류가 발생할 수 있으며 해당 오류가 올바르게 처리되지 않으면 호출 계약 내에서 서비스 거부 상황이 발생할 수 있습니다. 그러면 계약을 더 이상 사용하지 못하게 될 수 있습니다.

이러한 현상은 특히 루프 문 내에서 외부 호출을 실행할 때 발생하기 쉬우며 결제 처리 시에는 발생 가능성이 더욱 높아집니다. 그러므로 일반적으로는 사용자에게 자금을 송금하는 대신 사용자가 자금을 직접 인출하도록 하는 것이 더 효율적입니다.

예제 1: 다음 코드는 for 루프 문을 사용하여 send 외부 호출을 통해 모든 관련 주소에 대한 환불을 실행합니다.


function refundAll() public {
for(uint x; x < refundAddresses.length; x++) {
require(refundAddresses[x].send(refunds[refundAddresses[x]]));
}
}
References
[1] Standards Mapping - CIS Azure Kubernetes Service Benchmark 2
[2] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 5
[3] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 3
[4] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
[5] Standards Mapping - Common Weakness Enumeration CWE ID 703
[6] Standards Mapping - Smart Contract Weakness Classification SWC-113
desc.structural.solidity.swc113