Secure Coding Rule3 [Secure Coding] Signed integer의 Overflow 를 방지하라. Signed integer의 오버플로우는 정의되지 않은 행위로, 오버플로우가 발생한다 하더라도 프로그램은 동작이 되게 된다. 그러므로 의도치 않은 오버플로우는 자칫 프로그램의 취약점이 될 수 있다. 따라서 연산을 할 시 오버플로우를 고려하여 코드 작성 시 유의하여야 한다. 그러나 모든 연산 과정에서 오버플로우를 고려하는 것은 아니다. '+', '-', '++', '--', '/'와 같은 연산자의 경우 오버플로우를 고려해야 하지만 '&', '|', '||'와 같은 경우는 오버플로우가 발생하지 않는다. 다음으로 몇 예제를 가지고 왔다. Addition void Addition( int operator_1, int operator_2) { int sum = operator_1 + operator_2; /* N.. 2019. 12. 13. [Secure Coding] 정수 변환 과정에서 데이터의 손실을 방지. 정수 변환 과정에서 암시적 타입 변환(Implicit Type Conversion), 명시적 타입 변환(Explicit Type Conversion) 둘 다 손실이나 잘못된 해석으로 인한 변경으로부터 데이터를 보호해야 한다. Unsigned -> Signed #include int main() { unsigned int Sender = UINT_MAX; int Receiver; Receiver = (signed)Sender; } 위 코드를 보면 Sender에는 unsigned integer의 값인 4,294,967,295의 값이 들어가게 된다. 그러나 (signed) int의 경우 최대값이 2,147,483,647로 절반의 값에 해당하게 된다. 이는 Receiver가 Sender의 값을 담을 만큼의 범위.. 2019. 12. 13. INT30-C : wrap되지 않도록 코딩하자. INT30-C INT30-C을 준수하지 않았을 시 위험도는 매우 크며, 이미 짜여진 소스를 수정하는 것도 많은 비용이 들게 된다. 많은 비용이 들어간다는 의미는 수작업으로 직접 찾고 수정도 직접 해야하는 것을 의미한다. 따라서 소스코드를 짤 시 처음부터 위 규칙을 반드시 따르도록 한다. 위 규칙의 의미는 unsigned integer가 wrap되는 상황을 막도록 설계하라는 의미다. wrap이란 overflow와 비슷한 개념이라고 보면 되는데예를 들면 char의 범위는 -128~127이다. 만약 char result=127; result++;을 하게되면 result의 값은 -128의 값을 가지게 된다. 반면 unsigned의 경우 0~255의 범위를 가지는데 255를 넘어가면 0부터 값이 시작하게 된다. .. 2018. 11. 23. 이전 1 다음