버퍼 교환을 방지하는 방법

버퍼 교환을 방지하는 방법

이 질문은 Unix 및 Linux에만 해당됩니다. 하지만 이는 프로그래밍과 보안에 관한 것이기도 합니다.

내 프로그램은 여러 방법(비밀번호 파일 복호화, 프록시 요청 등) 중 하나를 통해 명시적인 비밀번호 또는 복호화 키를 얻을 것이며, 스왑 공간을 사용한 후 메모리에서 삭제되기 전에 스왑 공간에 쓸 수 없는지 확인하고 싶습니다. . 나는 이것이 교환 불가능한 주소 공간을 얻는 것을 의미한다고 생각합니다. 하지만 이를 위해서는 일반적으로 루트 권한이 필요하며 내 프로그램은 루트가 아닌 사용자로 실행되어야 합니다. 유닉스에서 이식 가능합니까? 리눅스에 희망이 있나요?

스왑 공간 없이 시스템을 구성하는 것은 옵션이 아닙니다.프로그램 사용자에게는 그러한 권한이 없을 수 있으므로 시스템을 더욱 안전하게 만들 수 있지만 모든 시스템에서 이를 수행할 수 있는 것은 아닙니다.

나는 이것을 할 수 있다부분C에서하지만 이것을 Python3에서도 구현하는 것이 좋을 것입니다.

내가 할 수 있을까?루트가 아닌프로세스가 일부 교환되지 않은 페이지를 가져옵니다.안전을 위해?

이 프로세스가 중단되는 것을 방지할 수 있나요? 거래소에 명확한 비밀번호를 쓰는 것보다 나가는 것이 낫습니다.

답변1

Linux에서 mlock 사용http://linux.die.net/man/2/mlock

mlock() 및 mlockall()은 각각 호출 프로세스의 가상 주소 공간의 일부 또는 전체를 RAM에 잠그므로 이 메모리가 스왑 영역으로 페이징되는 것을 방지합니다.

매뉴얼 페이지에 자세한 내용이 있습니다.

답변2

저는 결코 보안 전문가가 아니라는 점부터 말씀드리고 싶습니다.

Python 부분의 경우 ctypes를 사용하여 mlock을 Python으로 래핑하는 것이 어렵지 않은 것 같습니다. mlock에 대한 man의 제한 및 권한 섹션을 보면 일반 사용자가 제한된 양의 메모리를 잠글 수 있는 것으로 보입니다. 내 시스템에서 실행되는 내용은 비밀번호를 저장하기에 충분할 것 uname -a입니다 max locked memory (kbytes, -l) 64(그러나 오버플로에 주의해야 합니다).

최대 절전 모드에서는 이 신호를 처리할 수 없지만 SIGSTOP시스템이 정상이면 수신할 수 있습니다 SIGTSTP(참조).[Linux에서는 프로세스가 일시적으로 정지될 수 있나요?]). SIGSTOP받기만 하면[메모리에 저장된 비밀번호는 안전합니다]마치 디스크 암호화를 사용하지 않으면 운명이 정해져 있다고 말하는 것처럼 이것은 효율적인 솔루션이 아닐 수도 있습니다. 그러나 처리를 통해 위반사항을 발견할 수도 있지만 SIGCONT너무 늦을 수도 있습니다.

관련 정보