init_on_free 매핑되지 않은 VMA를 즉시 제로화하시겠습니까?

init_on_free 매핑되지 않은 VMA를 즉시 제로화하시겠습니까?

이 기능은 커밋에 추가되었습니다.6471384a, 페이지가 해제되면 초기화되어야 합니다. 이는 소스 파일에서 다음과 같이 수행됩니다.mm/page_alloc.c및 .free_pages_prepare()prep_new_page()

VMA가 매핑 해제되면(수동으로 또는 프로세스 종료 시 자동으로) 모든 프로세스 메모리가 0으로 초기화되는 것이 보장됩니까? 파이프를 통해 데이터를 전송하거나 커널과 사용자 간에 페이지를 전달하는 것과 관련된 커널 보드는 어떻습니까? 일부 태블릿에서는 작동하지만 사용자 페이지에서는 작동하지 않는 커밋 메시지에 설명된 중요한 예외에 유의하세요.

init_on_alloc=1과 init_on_free=1은 모두 할당자가 0인 메모리를 반환하도록 보장합니다. 두 가지 예외는 생성자와 SLAB_TYPESAFE_BY_RCU 플래그가 있는 보드 캐시입니다. 의미를 유지하기 위해 0으로 초기화되지 않습니다.

256비트보다 작은 모든 장치 매퍼 암호화 키를 나열한 다음 모든 장치 매퍼 대상을 제거하고 프로세스에서 키를 삭제하는 다음 가상 스크립트를 고려하십시오.

#!/bin/bash

count=0
dmsetup table --showkeys | while IFS= read table; do
    set -- $table # key material is now present in $6
    [[ ${#6} -lt 64 ]] && ((count++))
done
echo "$count keys less than 256 bits"
dmsetup remove_all --force

관련된 모든 프로세스가 종료된 후 중요한 데이터는 언제 보관됩니까 init_on_free=1? 스와핑이나 추적이 없다고 가정하면 슬러브 디버깅과 페이지 포이즈닝 등이 비활성화됩니다.


흥미롭게도 dmsetup사용하지 않고도DM_SECURE_DATA_FLAG, 버퍼의 플래그가 ioctl을 통해 DM으로 전달되어 버퍼가 지워질 수 있습니다.drivers/md/dm-ioctl.c:1855:

secure_data = param_kernel->flags & DM_SECURE_DATA_FLAG;

[...]

/* Wipe the user buffer so we do not return it to userspace */
if (secure_data && clear_user(user, param_kernel->data_size))
    goto bad;

아마도 프로세스가 종료되고 모든 페이지가 해제되면 이는 중요하지 않을 것입니다.

관련 정보