回头再看,感觉 android 对所有 app 开放 NDK 是大败笔

2018-07-10 18:57:31 +08:00
 s82kd92l
开放 NDK 初衷应该是为了应对很少场景下的高性能要求,比如直接处理音频 /视频编码。而随着 Java vm 优化越来越好,NDK 作为高性能替代品的作用也越来越小了。最需要性能的游戏其实也可能绕过 NDK,用 java+shader+renderscript/opencl/vulkan 做到不错的效果。

相反,NDK 的大门一开,却使得无数不务正业的黑科技成为可能:各种 hook/hotpatch 修改 Java VM 本身,各种 native 层的进程保活,长连接保活,访问私有 API,甚至利用 linux 内核漏洞 root。现在稍微大一点的项目,不再 native 层做反 hook 加壳都不好意思跟人打招呼,而且 hook 这些本来就是猫捉老鼠的游戏,甚至可以说是军备竞赛,战场是在用户的手机上,武器就是双方程序员的时间和精力,受伤的是 cpu 和电池。Google 这么多年在 android 安全上的投入,包括 selinux,seccomp 也都是主要针对来自第三方 NDK 代码的威胁。

所以我觉得 NDK 应该做成高危权限,没有明确的理由禁止使用,这样 android 的生态会清净得多。
12792 次点击
所在节点    Android
60 条回复
tempdban
2018-07-11 01:29:28 +08:00
还有你说文档大多只告诉 Java 层怎么用,咱先不管是不是这样,源码就摆在那,公开的科技他还叫黑科技?
还扯到 Root … 有多少 rootkit 是内核直接提权,有多少是利用系统服务提权。
你说 selinux 针对来自第三方 NDK 代码的威胁,兄弟,你怕是来引战的。
janus77
2018-07-11 02:05:54 +08:00
四个字,因噎废食
wweir
2018-07-11 08:08:04 +08:00
“ NDK 应该做成高危权限”
回波血,同意 lz 的观点,既然 ndk 能做到很多无法预见的事情,那把 ndk 标注为高危特殊权限就没毛病
opengps
2018-07-11 08:16:49 +08:00
选择空间越大,创新能力越强,题主喜欢规范统一没问题,只是容易错失一些创新
lolizeppelin
2018-07-11 08:16:53 +08:00
游戏还做不做了 没 ndk 你现在都能在安卓上玩些啥游戏。 安卓都 tm 没了好不
liprais
2018-07-11 08:22:41 +08:00
ndk 没问题,app 不审核才是最大的问题
randyzhao
2018-07-11 08:46:44 +08:00
这事应该应用市场去做
missdeer
2018-07-11 09:01:35 +08:00
偏激了,我们用 NDK 主要是为了代码跨平台
cxl008
2018-07-11 09:06:02 +08:00
安全层面考虑,最后代码必然下沉,越来越往下,java 那裸奔的感觉,反编译后随意修改。。。只能说你的看法比较片面
zj299792458
2018-07-11 09:09:56 +08:00
会安卓会 java 会 C 会 ndk 表示不知道你们在讲什么,ndk 和保活是啥关系?
Mutoo
2018-07-11 09:24:47 +08:00
游戏用 java 写的话,移植性就差了,这也是为什么 cocos2d-x 能干掉 cocos2d-java 和 cocos2d-objc 的原因。
flyingghost
2018-07-11 11:06:35 +08:00
开放本身没有错,开放是吸引力,开放是创新之源,开放是避免同质化的途径之一。
但窗户打开,难免就会有苍蝇进来。关窗吗?自绝之路。正确的做法是完善从线下到线上的安全体系、监测体系、事后惩戒体系。
windows 占了你说的多少个优点?开放、一堆 Undocumented、蛋糕足够大。win 的生态也确实足够糟糕的。那怎么办呢?
nicevar
2018-07-11 11:09:32 +08:00
@s82kd92l 还有很多第三方合作 app 的,没有推广渠道,盒子卖不了几个
另外 java 的混淆在怎么折腾防护能力也高不到哪去,还是 smali,静态分析动态分析不是什么问题,你想一下 windows 安全对抗发展那么多年,什么加密加壳虚拟机自己写 loader 都还被击破,我不知道你有没有听过安全发展那个笑话,一个 10G 的程序运行了一个小时后打印出了 hello world
VYSE
2018-07-11 11:25:00 +08:00
其实禁用 NDK 没啥用, 你得禁 ELF 执行, 不然 ptrace hook 上去也可以实现 JNI 提供的功能, 现有 Android 不现实, 只能通过 secommp 这些再进行些 API 管控
s82kd92l
2018-07-11 11:34:02 +08:00
@nicevar 你的论据正好说明了 java 与 native 的防护能力是五十步笑百步,windows 第三方大都是 c/c++写的也没好到哪去。能真正保证不被盗的只有一条铁律:不在客户端保存敏感代码,尽量不在客户端运行敏感代码。 @cxl008
s82kd92l
2018-07-11 11:35:34 +08:00
@VYSE 不让你用 NDK 你哪来的 ptrace?
jdgui
2018-07-11 11:38:37 +08:00
@zj299792458 之前版本的,liunx 运行个 c 进程去唤醒 app
nicevar
2018-07-11 11:55:38 +08:00
@s82kd92l 你错了,不是五十步笑百步,是五十步笑千步,如果 java 混淆能挡住 5%的人,那封装成 so 稍作处理就可能挡住 80%的人,差距是巨大的,软件根本不可能保证不被盗,只能阻止一部分人,这个值当然越大越好了
另外其实我想说即使没有 NDK,也会有一整套的东西出来,你没见过 iPhone 出来的时候不能开发软件没有 sdk,那开发链接工具是怎么来的了?除非你 android 连 rom 都不让人摸到
cxh116
2018-07-11 12:22:19 +08:00
如果 android 像 ios 只有一个应用市场,乱搞直接封帐号,就不会有这么多问题了。

从技术层面解决你说的应用问题是不存在的,人家 ios 还可以越狱乱调私有接口。但正规的应用不敢这样做。
zj299792458
2018-07-11 12:47:56 +08:00
@jdgui 怎么唤醒?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/469685

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX