【发布时间】:2017-03-11 19:59:20
【问题描述】:
请注意,虽然我在 Android 的上下文中提出这个问题,但它更像是一个关于 pipe(2) 的一般性 unix 问题......
要将大量数据从一个进程传输到另一个进程,可以使用ParcelFileDescritor.createPipe(),然后通过 binder 将管道的读取端发送到另一个进程。 ParcelFileDescritor.createPipe() 直接映射到 unix pipe(2) 系统调用。
虽然 FD 通过 binder 安全地传输到另一个进程,但由于 FD 最终只是一个 int,它是否有可能被恶意进程发现,甚至猜测、打开和读取?
根据我的阅读,这似乎归结为通过默默无闻来实现安全。只要你不知道,也猜不到 FD int 值,就可以了。匿名管道不会公开以其他方式发现 FD 的方法。但从理论上讲,似乎有人可以编写一个具有大量线程的应用程序,这些线程不断尝试基于随机 int 值打开 int,可能会利用一些选择数字的模式并最终利用 pipe(2)。
【问题讨论】:
-
你传递的是
ParcelFileDescriptor,而不是int,PFD不仅仅是一个简单的整数 -
我关心的不是它是如何传递的,而是底层文件描述符是否可以被未通过活页夹或其他方式传递的恶意进程发现。无论如何,PFD 最终包装了一个真实的文件描述符。
-
@pskink 感谢您的回复,但 FD 只是一个整数。您不需要 Android
ParcelFileDescriptor即可打开它。您可以使用fdopen(3)。您只需要 FD 的int值。 -
我试过
ParcelFileDescriptor#adoptFd(int)和ParcelFileDescriptor#fromFd(int)都抛出java.io.IOException EBADF (Bad file number)(将PFD传递给服务时它工作正常),但没有时间通过jni/ndk和@987654334检查它@
标签: android unix pipe parcel android-binder