不转储到 tmp 中的内存文件路径

Shu*_*ain 7 python encryption mmap data-protection in-memory

python中有没有办法获取内存文件的路径,因此对于需要文件路径的方法,它会像普通文件一样运行?

我的目标是保护文件,从而避免转储到 /tmp。

尝试读取加密文件 -> 将文件解密到内存中 -> 将其路径用于其他接口。

mmap不提供路径或文件名。

或者这个问题的任何替代解决方案?

Hom*_*512 5

你的标签没有提到操作系统,但我假设你运行Linux,因为你提到了/tmp。在这种情况下,您可以使用/dev/shm. 它是用于POSIX 共享内存的目录,通常是文件系统的挂载点tmpfs因此,除非系统必须交换,否则它会保留在内存中,但这与常规进程内存没有什么不同。

这意味着这应该适合您:

with tempfile.NamedTemporaryFile(dir='/dev/shm') as memfile:
    size = 1024
    memfile.file.truncate(size)
    mapped = mmap.mmap(memfile.file.fileno(), size)
Run Code Online (Sandbox Code Playgroud)

我应该提到的是,这显然是不可移植的,即使对于其他 Unix 系统也是如此。

就整个努力而言:人们可能会质疑它的意义。您要防范什么情况?命名临时文件已创建,且读取权限设置为仅限用户,因此只有三种方法可以读取它:

  1. 攻击者拥有root权限。到那时一切都已经失去了
  2. 攻击者拥有相同的用户权限。那时他们就可以读取你的进程内存
  3. 攻击者具有物理访问权限,可以读取文件系统/底层磁盘。如果这是一个可行的攻击媒介,磁盘加密应该是主要防御措施

当然,在深处进行一些防守并没有什么问题。

选择

这是另一个有趣的小技巧:使用/proc/<pid>/fd

with tempfile.TemporaryFile() as outfile:
    outfile.write(b"Username, Password")
    outfile.flush()
    filepath = f"/proc/{os.getpid()}/fd/{outfile.fileno()}"
    content = open(filepath).read()
Run Code Online (Sandbox Code Playgroud)

根据我的说法,它并没有更安全(如上所述)或更便携,但可能更混乱一些。另外,由于未命名文件由文件系统支持/tmp,因此它可能比共享内存大得多/dev/shm