Memory corruption

K
Kiminni

Back-End2025.11.22

Wikimedia Foundation, Inc. 블로그 포스트 번역
2004-02-02T22:52:00Z


Memory corruption컴퓨터 프로그램에서 메모리 위치의 내용이 원래 프로그래머의 의도나 프로그램/언어 구조를 초과하는 프로그래밍 동작으로 인해 수정될 때 발생합니다. 이를 메모리 안전성 위반이라고 합니다. Memory corruption의 가장 가능성 높은 원인은 프로그래밍 오류(소프트웨어 버그)입니다. 손상된 메모리 내용이 나중에 프로그램에서 사용될 때, 프로그램 충돌이나 이상하고 기이한 프로그램 동작으로 이어집니다. Windows 시스템의 애플리케이션 충돌 중 약 10%는 heap corruption으로 인한 것입니다.
CC++와 같은 현대 프로그래밍 언어는 명시적 메모리 관리와 pointer arithmetic의 강력한 기능을 가지고 있습니다. 이러한 기능은 효율적인 애플리케이션과 시스템 소프트웨어를 개발하기 위해 설계되었습니다. 그러나 이러한 기능을 잘못 사용하면 memory corruption 오류가 발생할 수 있습니다.
Memory corruption은 두 가지 이유로 가장 다루기 어려운 프로그래밍 오류 중 하나입니다:
  1. Memory corruption의 원인과 그 증상이 멀리 떨어져 있을 수 있어서 원인과 결과를 연관시키기 어렵습니다.
  1. 증상이 비정상적인 조건에서 나타나므로 오류를 일관되게 재현하기 어렵습니다.
Memory corruption 오류는 크게 네 가지 범주로 분류할 수 있습니다:
  1. 초기화되지 않은 메모리 사용: 초기화되지 않은 메모리의 내용은 쓰레기 값으로 취급됩니다. 이러한 값을 사용하면 예측 불가능한 프로그램 동작으로 이어질 수 있습니다.
  1. 소유하지 않은 메모리 사용: 메모리에 접근하고 수정하기 위해 pointer를 사용하는 것이 일반적입니다. 이러한 pointer가 null pointer, dangling pointer(이미 해제된 메모리를 가리킴), 또는 현재 stack이나 heap 범위 외의 메모리 위치를 가리키는 경우, 프로그램이 소유하지 않은 메모리를 참조하고 있습니다. 이러한 pointer를 사용하는 것은 심각한 프로그래밍 결함입니다. 이러한 메모리에 접근하면 일반적으로 운영 체제 예외가 발생하며, 대부분 프로그램 충돌로 이어집니다(적절한 메모리 보호 소프트웨어를 사용하지 않는 한).
  1. 할당된 메모리를 초과하여 메모리 사용(buffer overflow): 배열이 잘못된 종료 조건으로 루프에서 사용되면 배열 범위를 초과하는 메모리가 실수로 조작될 수 있습니다. Buffer overflow는 컴퓨터 바이러스에 의해 악용되는 가장 일반적인 프로그래밍 결함 중 하나이며, 널리 사용되는 프로그램에서 심각한 컴퓨터 보안 문제(return-to-libc attack, stack-smashing protection 등)를 야기합니다. 경우에 따라 프로그램이 buffer의 시작 전 메모리에 잘못 접근할 수도 있습니다.
  1. 결함 있는 heap 메모리 관리: 메모리 누수와 heap이 아닌 메모리나 할당되지 않은 메모리 해제는 결함 있는 heap 메모리 관리로 인한 가장 빈번한 오류입니다.
Purify, Valgrind, Insure++, Parasoft C/C++test, AddressSanitizer와 같은 많은 memory debugger가 memory corruption 오류를 감지하기 위해 사용 가능합니다.

참고문헌

Radich, Q.; Sherer, T.; Sharkey, K.; Batchelor, D.; Kennedy, J. T.; Mabee, D.; Coulter, D.; Michael, S. (28 April 2021). "Application Verifier (Windows 7 and Windows Server 2008 R2 Application Quality Cookbook) - Win32 apps". Microsoft Developer Network. Retrieved 2022-02-09.

외부 링크

0
0

댓글

?

아직 댓글이 없습니다.

첫 번째 댓글을 작성해보세요!