제가 대학에 다닐 때 메모리 할당 시 메모리 잠금을 요청할 수 있다는 말을 들었습니다. 이렇게 하면 디스크로 스왑되는 것을 방지할 수 있습니다. 이는 디스크 일시 중지가 완료되면 교체되기 때문에 잘못된 것입니다. (잠금 비트는 보안이 아닌 성능을 위한 요청이므로 수행 중인 작업을 알고 있는 경우에만 사용해야 합니다.)
그래서 안전한 메모리를 할당할 수 있는 방법이 있는지 궁금합니다. 두 가지 아이디어가 있지만 구현 여부는 알 수 없습니다.
보안 잠금: 최대 절전 모드를 방지하므로 프로세스에 메모리 해제를 알리는 신호를 보내는 방법이 없으면 시스템의 다른 부분에 문제가 발생할 수 있습니다. 하지만 그렇지 않다면 어떨까요?
휘발성/일시적 메모리 요청: 시스템이 스와핑이나 경고 없이 메모리 매핑을 해제할 수 있기 때문에 RAM보다 휘발성이 더 크다는 의미로 휘발성을 사용합니다. 이로 인해 애플리케이션이 처리해야 하는 메모리 오류가 발생할 수 있습니다.
암호 해독 캐시에는 대규모 할당이 사용되며 매핑 해제가 가능하지만 다시 구축할 수도 있습니다. 암호 문구의 경우 더 작은 할당량에 저장되며 매핑이 해제되지 않기를 바랍니다(최대 절전 모드 제외). 암호가 매핑되지 않은 경우 사용자 상호 작용이 필요합니다.
다른 대안을 포함하여 그러한 것이 존재합니까?
저는 Debian9 Gnu/Linux를 사용하고 있지만 다른 운영 체제의 기능에도 관심이 있습니다.
답변1
최대 절전 모드를 제외하고 mlock()은 Linux의 RAM에 메모리가 유지되도록 보장합니다. 이는 사용 가능한 메모리와 동일한 크기의 메모리 블록을 할당하기 위해 malloc()을 호출하고, 이에 대해 mlock()을 호출한 다음 모든 페이지에서 오류를 강제 실행함으로써 시스템에서 매우 간단하게 설명할 수 있습니다. 생산) OOM 킬러가 실행되고 테스트 프로그램이 수확 대상으로 선택되지 않을 수 있습니다. 따라서 최대 절전 모드 대신 mlock()을 신뢰할 수 있습니다.
최대 절전 모드는 까다롭지만 문제를 부분적으로 해결할 수 있는 방법이 있습니다. 위협 모델이 root
사용자를 신뢰한다고 가정하면(그리고 반드시 그래야 함) 메모리에 민감한 데이터가 있을 때 최대 절전 모드를 방지하기 위해 systemd에 연결할 수 있어야 합니다. 이것이 완벽하지는 않지만 아마도 얻을 수 있는 가장 가까운 결과일 것입니다. 또는 프로그램이 잠자기 시작하면 이를 알리고 중요한 메모리를 지우는 후크를 등록할 수 있다고 생각하지만 이에 대해 100% 확신할 수는 없습니다.
어느 쪽이든, 아마도 당신은 그것을 지나치게 생각하고 있을 것입니다.
범용 소프트웨어를 작성 중이고 플랫폼에 대한 제어권이 전혀 없는 경우(GPG 또는 OpenSSL 등) 사용자가 위험을 알고 mlock() 적절한 메모리 영역을 제공한다고 가정해야 합니다. 이와 같은 옵션을 사용하면 일시적(예: zram) 또는 암호화 스왑을 사용하는 사람들은 리소스 사용량 적중을 옵트아웃하고 작업을 완료할 수 있습니다. 또한 커널의 기본 최대 절전 모드 지원은 보안 문제(잘 문서화되어 있음)이지만 사용자 공간 구현(예: µswsusp)에는 암호화 지원이 내장되어 있는 경우가 많습니다.
그러나 운영 체제를 실행하는 소프트웨어를 제어하는 경우 최대 절전 모드 지원을 비활성화한 상태에서 자체 커널을 구축할 수 있습니다.
답변2
메모리 교체를 방지하는 것은 그다지 유용하지 않습니다(커널 제외). 당신이 걱정하는 위협은 공격자가 운영 체제를 우회하고 디스크에서 스왑된 데이터를 읽는 것입니다. 이는 공격자가 디스크에 물리적으로 접근할 수 있다는 의미입니다. 실제로 이는 공격자가 컴퓨터에 물리적으로 접근할 수 있으므로 RAM에서 동일한 정보를 읽을 수 있음을 의미합니다. 그것예몇 초 동안 전원이 꺼진 RAM 칩에서 데이터를 추출할 수 있습니다. 그다지 신뢰할 수는 없지만 최근 RAM에 비밀 데이터가 있는 경우 컴퓨터를 유휴 상태로 두어서는 안 될 만큼 걱정스럽습니다.
프로그래머로서 최대 절전 모드를 방지하기 위해 이상한 운영 체제 트릭을 찾지 마십시오. 보안을 손상시켜 기능을 손상시키기 때문에 사용자는 이를 싫어할 것입니다.
사용자로서 스왑 공간을 암호화하십시오.