NAME
bzero, explicit_bzero - 바이트 열을 0으로 채우기
SYNOPSIS
#include <strings.h>
void bzero(void *s, size_t n);
#include <string.h>
void explicit_bzero(void *s, size_t n);
DESCRIPTION
bzero()
함수는 s
가 가리키는 위치에서 시작하는 n
바이트 메모리에 0을 ('\0'을 담은 바이트들을) 기록해서 데이터를 지운다.
explicit_bzero()
함수는 bzero()
와 같은 일을 수행한다. bzero()
와의 차이는 컴파일러에서 그 지우기 동작이 "불필요"하다고 추론한 경우에도 컴파일러 최적화가 그 동작을 없애지 않도록 보장한다는 점이다.
RETURN VALUE
없음.
VERSIONS
glibc 2.25에서 explicit_bzero()
가 처음 등장했다.
ATTRIBUTES
이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.
인터페이스 | 속성 | 값 |
---|---|---|
bzero() , explicit_bzero() |
스레드 안전성 | MT-Safe |
CONFORMING TO
bzero()
함수는 제거 예정이다. (POSIX.1-2001에서 LEGACY로 표시됨.) 새 프로그램에서는 memset(3)을 사용하라. POSIX.1-2008에서 bzero()
명세를 제거하였다. 4.3BSD에서 bzero()
함수가 처음 등장했다.
explicit_bzero()
함수는 일부 BSD들에도 있는 비표준 확장이다. 몇몇 다른 구현에는 memset_explicit()
이나 memset_s()
같은 비슷한 함수가 있다.
NOTES
explicit_bzero()
함수는 보안에 신경쓰는 응용에서 bzero()
사용 시 맞닥뜨릴 수 있는 문제를 해결하기 위한 것이다. 0으로 채운 위치를 올바른 프로그램에서 절대 다시 건드리지 않는다고 컴파일러에서 추론하면 bzero()
호출을 아예 없앨 수도 있다. 그런데 그 bzero()
호출의 의도가 민감한 데이터(가령 암호)를 지워서 오동작하거나 취약해진 프로그램에 의해 데이터가 누출될 가능성을 막는 것이었다면 문제가 된다. explicit_bzero()
호출은 절대 컴파일러가 최적화하지 않는다.
explicit_bzero()
함수가 민감한 데이터 지우기와 관련된 모든 문제를 해결해 주지는 않는다.
-
explicit_bzero()
함수는 민감한 데이터가 메모리에서 완전히 지워졌음을 보장하지 않는다. (bzero()
도 마찬가지다.) 예를 들어 레지스터나 "작업용" 스택 영역에 민감한 데이터의 사본이 있을 수 있다.explicit_bzero()
함수에서는 그런 사본들에 대해 알지 못하므로 지울 수가 없다. -
어떤 상황에서는
explicit_bzero()
가 보안성을 떨어뜨릴 수 있다. (데이터가 충분히 작으며explicit_bzero()
호출 말고는 변수 주소를 받는 동작이 없어서) 민감한 데이터를 담은 변수를 레지스터에 저장하게 최적화할 수 있다고 컴파일러가 판단한 경우에는explicit_bzero()
호출 시 레지스터에서 RAM의 어떤 위치로 데이터를 복사하고서 그걸 즉시 지우게 된다. (레지스터의 사본은 영향을 받지 않는다.) 여기서 문제는 RAM의 데이터가 레지스터의 데이터보다 버그에 노출될 가능성이 높고, 그래서explicit_bzero()
호출이 만드는 작은 시간 틈새 동안에 민감한 데이터가 데이터 지우기 시도를 하지 않았을 경우보다 취약해진다는 점이다.
참고로 민감한 변수를 volatile
한정자로 선언해도 위 문제가 제거되지 않는다. 사실은 더 악화되는데, 예를 들어 레지스터에 저장하게 최적화될 수도 있었을 변수를 전체 수명 동안 (더 취약한) RAM에 유지하게 만들 수 있기 때문이다.
위의 세부 내용들에도 불구하고 보안에 신경쓰는 응용에서는 일반적으로 explicit_bzero()
를 쓰는 게 안 쓰는 것보다 낫다. explicit_bzero()
의 개발자들은 미래의 컴파일러가 explicit_bzero()
호출을 인식해서 레지스터와 "작업용" 스택 영역의 사본을 포함한 민감한 데이터의 모든 사본들이 지워지게 하는 조치를 취할 것으로 예상한다.
SEE ALSO
bstring(3), memset(3), swab(3)
2021-03-22