- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
请注意,虽然我是在 Android 环境下问这个问题,但它更像是一个关于 pipe(2) 的一般 unix 问题 ...
要将大量数据从一个进程传输到另一个进程,可以使用 ParcelFileDescritor.createPipe()
,然后通过绑定(bind)器将管道的读取端发送到另一个进程。 ParcelFileDescritor.createPipe()
直接映射到 unix pipe(2) 系统调用。
虽然 FD 通过 binder 安全地传输到其他进程,但由于最终 FD 只是一个 int,它是否有可能被发现,甚至被恶意进程猜测、打开和读取?
从我的阅读来看,这似乎归结为通过默默无闻的安全性。只要你不知道,也猜不出 FD 的 int 值,就可以了。匿名管道不会公开以其他方式发现 FD 的方法。但从理论上讲,有人可能会编写一个具有大量线程的应用程序,这些线程会不断尝试根据随机 int 值打开 int,可能会利用某种选择数字的模式并最终利用 pipe(2)。
最佳答案
Linux 内核为每个进程 (struct fdtable
) 跟踪一个文件描述符表 (more or less)。此表中的条目由小整数索引——从 0、1、2 等开始,新条目被赋予最小的可用整数——并且每个条目指向一个打开的文件 (struct file
)。
Linux 内核中的文件是 inode ( struct inode
) 和一些状态(例如搜索位置)的句柄。
如果多次打开同一个文件,文件描述符表中会有多个条目,每个条目指向不同的文件结构,每个条目都指向同一个inode结构。
如果你打开一个文件,然后dup
文件描述符,您将在文件描述符表中有多个条目,每个条目都指向相同的文件结构。
创建 pipe
结果产生两个文件描述符:读端和写端。它们有些神奇:从第一个文件描述符读取将返回写入第二个文件描述符的数据。在创建时,管道的两端只能被本进程访问。
将文件描述符传递给另一个进程(这通常由 sendmsg
通过附加辅助 AF_UNIX
的 SCM_RIGHTS
域套接字完成,但在 Android 上由 Binder.transact
完成 Parcel.writeFileDescriptor
)导致一个新条目被添加到接收进程的文件描述符表中,指向与发送进程的文件描述符表中的原始条目相同的文件结构。注意:两个进程中同一文件的整数索引不相关;事实上,它可能会有所不同。
通常在 C 中,您会使用 fopen
获得一个 FILE *
结构,你可以 fread
/fwrite
/ETC。上。 C 运行时库通过打开一个文件描述符并将其包装为一个结构(包含额外的缓冲等)来实现这一点。 fdopen
接受一个已经在本地进程中打开的文件描述符,以及围绕它的 FILE *
结构。
将各个部分放在一起:
没有其他进程可以通过猜测 FD 编号打开文件,因为这些数字仅在单个进程中有意义。*在进程之间传递文件描述符是安全的,由内核调解,内核正在操纵只有内核拥有的对象访问权限。
*给予适当的权限,您可以通过/proc/$PID/fd/$FD
伪文件系统找到其他进程的文件描述符并为您自己重新打开它们。但是,“适当的权限”是“相同的用户或根”。在 Android 上,所有应用程序都以不同的用户身份运行,没有一个以 root 身份运行——这是不可能的。此外,Android 的 SELinux 策略会阻止应用程序以任何方式与 /proc
接口(interface)进行交互。
关于android - ParcelFileDescritor.createPipe(),又名 pipe(2) 和安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40313324/
我有管道输出 command_a | command_b | ... | command_n 输出是一个数字序列 4.2 -1 ... 0.2 我可以使用 gnuplot 绘制这些数字吗? (将 gn
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我目前正在尝试连接父项和子项之间的管道。子级正在执行 sort 并对从父级接收到的输入进行排序。然后 children 写入一个单独的管道。每个进程有两个管道。一个这样 parent 可以将输入发送给
最近我正在研究 Python 中的并行编程工具。这是 os.pipe 和 multiprocessing.Pipe 之间的两个主要区别。(尽管它们被使用的场合) os.pipe是单向,multipro
我的站点上运行着 Yahoo Pipe,Romneyomics它使用来自 Delicious 和 Topsy 的饲料。Delicious 提要不提供“描述”字段,但 Topsy 提供,并且不仅仅是一个
我有一些使用管道的 Haskell 代码: module Main(main) where import Pipes a :: Producer Int IO () a = each [1..10]
所以标题几乎解释了我的问题。 stdout=subprocess.PIPE 和 stdout=PIPE 有什么区别?两者都来自 subprocess 模块,但为什么要使用一个而不是另一个呢?你如何使用
我有一个名为“myPipe”的自定义管道。我得到: The pipe 'myPipe' could not be found error 在我的单元测试中请建议在我的 .spec.ts 中导入和声明什
我有一个非常简单的 Python 3 脚本: f1 = open('a.txt', 'r') print(f1.readlines()) f2 = open('b.txt', 'r') print(f
我正在使用管道和 Python 的多处理模块在进程之间发送简单的对象。文档指出,如果管道已关闭,则调用 pipe.recv() 应该引发 EOFError。相反,我的程序只是阻塞在 recv() 上,
我在 perl 中见过这两种形式的管道 open。 一种是简单的管道打开 open FH,'| command'; 其他是安全管道打开 open FH,'|-','command'; 现在,第二个中的
我正在尝试对我的组件进行单元测试,但它立即生成一个错误: 类型错误:this.store$.pipe 不是函数 根据我的理解, createSpyObj 应该模拟状态。我有不同的选项选项,但没有一个起
我在这里看到这个帖子很多次了;但未能从命令中捕获故意错误。迄今为止我找到的最好的部分工作.. from Tkinter import * import os import Image, ImageTk
我正在编写一个简单的程序来解析编译器的输出并重新格式化任何错误消息,以便我们使用的 IDE(visual studio)可以解析它们。我们使用 nmake构建,它将使用如下命令行调用编译器: cc16
我有一个在coreos上运行的kubernetes集群。我希望在称为记录的Pod中的容器中运行journal2gelf https://github.com/systemd/journal2gelf。
为什么当管道中没有写入器时,读取器存在可以,但当管道中没有读取器时,写入器存在就不行? 。是不是因为reader需要等待,所以没有writer也没关系,而writer已经准备好数据了,即使数据准备好了
我在/etc/postfix/master.cf 中创建了一个 postfix 命令管道,其中包含一个在 STDOUT 和 STDERR 上产生输出的有效命令。在终端上调用时一切正常(因此在 STDO
我有一个命令需要来自管道的输入。例如,考虑著名的 cat 命令: $ echo Hello | cat Hello 假设我在 Perl 6 程序中有一个字符串,我想将其通过管道传递给命令: use v
因此,由于我们拥有各种设置,我习惯于遇到需要将一个可观察结果添加到另一个结果的地方,然后同时使用两者。我需要第一个在另一个之前完成的地方 getUser() .pipe( mergeMap
我在 Angular 5 中有一个非常简单的管道 import { Pipe, Injectable } from '@angular/core'; @Pipe({ name: "defaul
我是一名优秀的程序员,十分优秀!