V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
noli
V2EX  ›  奇思妙想

[空想] 改造 FreeBSD 变成移动设备操作系统

  •  
  •   noli · 2017-08-05 17:56:58 +08:00 · 11209 次点击
    这是一个创建于 2670 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目的:兼有开放性,以及安全性。

    FreeBSD 也是一个重要的开源操作系统。
    FreeBSD 的 Jail 本身就是一个非常好的操作系统级别的安全基础。

    拿 FreeBSD 改造成一个开放型的 另一个 iOS,
    搭配 C/C++ Rust Swift ObjC Golang 等等的可生成原生二进制应用的 App

    会不会有前景呢
    75 条回复    2017-08-09 19:05:59 +08:00
    jhaohai
        1
    jhaohai  
       2017-08-05 18:40:52 +08:00 via iPhone
    macos,ios 本身就是基于 bsd 的啊
    realwangyibo
        2
    realwangyibo  
       2017-08-05 18:48:01 +08:00 via iPhone   ❤️ 1
    psvita、nintendo switch 算是符合标题

    内容的话,另搞一套的成本不低,大家没动力切换
    pqee
        3
    pqee  
       2017-08-05 18:57:23 +08:00 via Android
    iOS 是基于 Open BSD 4 的
    lydasia
        4
    lydasia  
       2017-08-05 19:48:25 +08:00
    没生态有卵用。协议比较宽松,所以其实挺多东西都是基于 BSD。PS4、FreeNAS、m0n0wall、pfSense 等等。
    此外 macOS 不是啥 BSD,是正牌 UNIX。
    https://www.opengroup.org/openbrand/register/
    kaneg
        5
    kaneg  
       2017-08-05 20:03:42 +08:00 via iPhone
    要做通用的移动操作系统,有两个问题需要解决,一个是硬件驱动,一个是软件生态。苹果的系统因为只需要支持自家设备,所以驱动不是问题,App store 解决了软件生态的问题。安卓谷歌解决了软件生态问题,而设备驱动是各家手机厂商自己负责。
    所以照此思路,操作系统的底层用 Freebsd 还是 Linux 并不重要。
    sprintfan
        6
    sprintfan  
       2017-08-06 00:13:03 +08:00 via Android
    很大胆的想法,就剩找个实力超强的人或者公司来实现它
    bao3
        7
    bao3  
       2017-08-06 01:57:17 +08:00
    @lydasia macOS 10.12.5 Darwin bogon 16.5.0 Darwin Kernel Version 16.5.0。
    https://en.wikipedia.org/wiki/Darwin_(operating_system)

    楼主说的是没错的,别拿 Darwin BSD 不当 BSD 啊,BSD 也是正统的 Unix。
    maxiujun
        9
    maxiujun  
       2017-08-06 08:07:38 +08:00
    @noli 有前途, 时不我待,赶快干吧。
    726332269
        10
    726332269  
       2017-08-06 08:23:09 +08:00 via Android
    搞操作系统没钱不可能做出来的
    hjc4869
        11
    hjc4869  
       2017-08-06 08:57:13 +08:00 via Android
    开放性没啥用,建议楼主再想想有什么别的独特优势
    iscraft
        12
    iscraft  
       2017-08-06 09:37:05 +08:00
    这种想法至少晚了十年 你以为 FreeBSD 的那帮大佬都是干什么吃的
    RqPS6rhmP3Nyn3Tm
        13
    RqPS6rhmP3Nyn3Tm  
       2017-08-06 10:17:19 +08:00 via iPad
    @lydasia macOS 是基于 BSD 和 macOS 是 UNIX 不冲突
    levn
        14
    levn  
       2017-08-06 11:44:49 +08:00
    在劝说 Linus 加入苹果失败后,FreeBSD 创始人之一 Jordan Hubbard 于 2001 年加入了苹果,直到 2013 年离开,Jordan Hubbard 在苹果呆了 12 年。
    noli
        15
    noli  
    OP
       2017-08-06 17:10:14 +08:00
    @kaneg 对照 iOS 和 Android 的情形,操作系统内核是 Freebsd 还是 Linux 似乎是不重要。
    但要命的偏偏就是 Freebsd 下有效的硬件驱动太少。甚至只能加封装一个 Linux 驱动的适配层。
    所以从技术实现的角度来看,内核用 linux 还是 Freebsd 很重要。

    @hjc4869 我觉得开放性很重要。我认为国内的 Android 市场恰恰就是因为被神秘力量控制了,所以实际上是不开放的,才会出现那么多“不给权限就不工作”的 App。而 iOS 上如果开放型确实足够,那我们现在应该还能装 VPN app。
    hjc4869
        16
    hjc4869  
       2017-08-06 21:28:31 +08:00 via Android
    @noli 你的逻辑稍微有一点点矛盾,
    Android 本身开放-开放的特性造成 app 开发商不老实-开放的 benefit 最终没有落到用户手里,而且用户体验不佳
    iOS 本身不开放-app 开发商搞不定水果,不得不老老实实-用户没法用开放的系统,但是流氓 app 的体验相对好。

    这样看来,是不是再做一个开放的 OS,最终不得不走 android 老路?
    hjc4869
        17
    hjc4869  
       2017-08-06 21:31:25 +08:00 via Android
    补充一个折衷的:
    WP 本身半开放,OEM 可以免费拿授权,用户虽说主要通过 Store 获得 app,但是也可以不用任何越狱 /解锁,直接在设置里打开 dev mode 自己装 appx,但是装出来的 app 仍然权限受限-app 开发商得遵守权限限制要求,又不影响用户自由-结果 WP 死了
    noli
        18
    noli  
    OP
       2017-08-06 22:34:36 +08:00
    @hjc4869 我没有理解你说的矛盾在哪里。

    我想完整表述的观点是这样:

    1. Android 本身是开放的,但并不是开放的就会形成有效的市场竞争。国外的先不说。国内市场实际上并不是有效的市场竞争,几个重要的 Android ROM 和手机制造商控制了 Android App 生态,App 开发者只要好好地拜码头而不是服务好用户,就能生存。于是 Android App 的质量相对 iOS 比较差,以至于出现了一些“不给权限就不可以(愿意)正常工作的 App ”。当然用户可以选择不使用这样的 App,但这是这样对用户的权利和对 App 开发者来说是双输的。

    更重要的是,Android 据我的了解并没有很好地保护开发者和 App 用户。例如 Android 可以动态注入各种补丁干扰一个 App 的行为;对用户 Android App 的权限机制设计也并没有 iOS 来得用心,权限太多普通 App 使用者根本无从适应,也没有一个很好的事后检查权限的机制。

    2. Apple iOS 对开发者本身是非完全开放的,但是 iOS 保护用户权利方面比较给力,虽然 App 要上 App Store 的这个过程必须经过审核,这并是非市场行为,但由于先发优势形成开发者数量众多,iOS 要适配机型相比 Android 更容易,开发者难度降低,所以 iOS app 开发形成了有效的竞争(对比 Android 某些 App 只能在某些 ROM 或者手机上运行良好)。并且用户可以很容易地找到 操作系统对 用户自身权利的保护机制(我就没见过哪个国产 Android ROM 能很方便找到 “隐私” 选项)。总的来说,在 iOS 上,Apple,App Developer,User 三方共赢的机会是很大的。虽然庄家 Apple 的赢面最大。

    3. 理想的 OS Platform,App Developer,User 的生态,应该是 App Developer 服务 User,OS 同时服务 developer 和 User。User 可以通过 OS 控制 App 和 App Developer 的行为。这样才是一个有效的市场机制——不光要有自由竞争,还要有信息和信号控制竞争行为(所谓看不见的手)。

    Android 要做到这一点,其实只差一小步,就是有效地隔离系统服务器和 App 之间的互相干扰,隔离用户数据和 App 数据。但是 linux kernel 其实一直都缺乏这样都基因,cgroup 等也是 docker 发展起来之后才被重视的概念,但目测在 Android 上引入是遥遥无期了。

    Freebsd 很早就有 jail 这种系统级的隔离机制 ( iOS 越狱一词即是这个概念的衍生)。

    WP 并非不优秀,非战之罪,后知后觉。
    hjc4869
        19
    hjc4869  
       2017-08-06 22:39:11 +08:00 via Android
    @noli 那么达成这个目标魔改安卓远远比用 bsd 做新 OS 容易。不如说,现在的第三方工具比如 island 等,已经很符合你的设想了。
    noli
        20
    noli  
    OP
       2017-08-06 23:27:46 +08:00
    @hjc4869 所有的第三方工具都只不过是打算驱虎吞狼而已。能不能真的吞狼还两说呢,至少你说的 island 我就用过,这些工具出了一代又一代。只是用个手机而已,还要管 App 之间的勾心斗角,完全是南辕北辙啊。
    Shangxin
        21
    Shangxin  
       2017-08-07 00:07:15 +08:00
    其实做个玩玩还是可以的,支持
    afpro
        22
    afpro  
       2017-08-07 06:43:27 +08:00
    ubuntu 曾经尝试过 然后嘞
    raiz
        23
    raiz  
       2017-08-07 09:48:28 +08:00
    记得 s60 下载应用时选择机型的列表, 对比安卓的基本机器无关的应用适配能力,区别不在于内核;
    内核固然重要,给厂商的利益,给开发者的环境,给用户的入口更加重要,Android 这方面做的很好,即使 Andy Rubin 一开始 以 BSD 为内核开发 Android,我想 Android 的优秀程度应该差不多。
    hjc4869
        24
    hjc4869  
       2017-08-07 10:35:18 +08:00 via Android
    @noli 我的意思是你魔改安卓增强这方面的体验,比如把 island,或者把国产 ROM 的那些专门治国产 app 的功能抄过来,比重新从 0 开始做 BSD based 生态容易一万倍。

    把 Linux 上的 cgroup, namespace 引入安卓也比拿 BSD 重新做容易。做出来完全不需要让用户去折腾。
    noli
        25
    noli  
    OP
       2017-08-07 10:52:35 +08:00
    @raiz 区别当然是在于内核吧,Android 一开始就是靠 JAR 的变种 Dex 来磨平 不同机器上的 SDK 差异。学术上来说,Symbian 微内核比 Linux 的宏内核更有适应性。如果 Android 是微内核,那么移植 OS 肯定比今天容易多了,因为适应不同机型直接运行时换驱动就可以了,不用重新编译内核,参考今天的 Windows。

    @hjc4869 魔改 Android 改 kernel 似乎比较容易。但是,改的时候要不要兼容各种形形色色的 Android 需求呢?如果不兼容,那你改出来的东西还能叫 Android 吗?重新从 BSD 出发,或许你还可以做 Linux 的驱动兼容层,但同时没有 Android 负担,轻装上阵,反而比 从 Android 出发容易吧——如果容易是指技术难度的话。
    hjc4869
        26
    hjc4869  
       2017-08-07 11:07:13 +08:00
    @noli 魔改安卓就算最后出来的是不兼容安卓的 OS,也比从 0 开始魔改 BSD 容易啊。万一你魔改的是 BSD,但是客户要求你兼容安卓,那不亏大发了?
    gemini767
        27
    gemini767  
       2017-08-07 11:46:22 +08:00
    @lydasia 搞笑呢,Darwin 本身是 Mach 爆改+BSD,而 BSD 本身就是 unix 的延续,都是一家人,发型协议不同还分?
    gemini767
        28
    gemini767  
       2017-08-07 11:51:02 +08:00
    @noli 搞系统,系统设计固然很重要,生态才是王道,但是核心是硬件!!你看 Google 不管怎么开源怎么随意,每年一步硬件还是代工,所以感觉手机操作系统,看的其实不是系统设计,而是硬件能力。
    permaylau
        29
    permaylau  
       2017-08-07 11:51:47 +08:00 via Android
    索尼基于 Freebsd 系统做了 ps4 的主机系统,系统内核和底层不重要,关键是硬件驱动和应用层面的第三方支持,这是最重要的。
    zhicheng
        30
    zhicheng  
       2017-08-08 14:13:13 +08:00
    如果你面对的市场是消费电子,FreeBSD 并没有任何优势。你也没办法证明 FreeBSD 的安全性比 Linux 更好。你也没有办法说服厂商为你开发一套新的驱动。移动设备的硬件开放程度远不如 PC,BSD 系在 PC 上表现尚不佳。

    iOS 基于 FreeBSD,但 iOS 并不是因为基于 FreeBSD 而成功的。如果 iOS 基于 Linux 也一样会成功。消费电子没有人在乎你用的什么内核。

    FreeBSD 比较大的优势是许可证商业化更友好,这也是为啥主机厂商用它,但如果本身就是要做一个开放系统,这一点似乎意义并不大。按照 Google 的态度,他们肯定更倾向于 BSD 系,但显然连他们都没办法搞定厂商和开发者。

    现代 Linux 是一个非常先进和完善的内核,面向消费电子,需要你改的地方并不多,你也改不出什么竞争力。

    所以不要拿个锤子看什么都是钉子。
    noli
        31
    noli  
    OP
       2017-08-08 16:42:09 +08:00
    @hjc4869

    虽然我还没付诸实践,但是把 cgroup 这样的东西引入 Android,据我所知 Android 是要大改的,所以兼容 Android 基本上没有意义,还不如抛弃这种有害生态。

    本质上 cgroup 并不是一个为安全而设计的内核功能,LXC 才是,但 LXC 实际上已经被弃用了。但是 jail 不一样,jail 从诞生到设计就是为了安全的,搭配 ZFS 的方案已经成熟得很。


    @zhicheng 除了第一段,其他你说的我都不同意。

    1. iOS 就是因为基于 FreeBSD 才占了很大便宜的。iOS 用 Linux 作为内核的话今天的 iOS 估计连沙盒模型都没有,也不会享受 FreeBSD 稳定的 API 带来的好处。你说 iOS 基于 Linux 也一样会成功,这信口开河有点过了,毕竟 iOS 的成功之处,从商业角度来看,从 App 质量来看,Android 都不是很有优势。

    2. Google 用 Android 以及 Android 是一个 Linux,我认为是一个偶然,因为 Android 一开始就是基于 linux 内核。仅此而已。你也没有什么列举理由说明 Android 一开始就只适合用 Linux 内核。“没有人在乎你用什么内核”,这只是普通消费者的无知,来讨论这个话题的都不是普通无知消费者。

    3. Linux 的内核很先进很完善? 不敢苟同,epoll kqueue 这种事情上看得出,Linux 内核并不是精心设计而是自然而成的。epoll 在 2.5.4 kernel 引入,时间大概是 2004 年左右; kqueue 在 Freebsd 4.1 引入,大约 2000 年左右;有 4 年时间空隙模仿 kqueue 却出了一个画虎不成反类犬的 API。Linux 社区这样的作风我确实很不感冒,也不觉得先进。

    再往大一点说,FreeBSD 上的 Unix 积累比 Linux 深厚多了。Linux 的竞争优势仅仅是开源比较早以及搭上了 GNU 运动的风潮。当然,GPL 也是一个让大公司愿意投入的因素——因为保证了自己的投入不仅仅是为竞争对手做嫁衣。

    4. 非要说锤子钉子这种空话就没意思了,什么是锤子什么是钉子你也分得清?
    hjc4869
        32
    hjc4869  
       2017-08-08 16:53:01 +08:00
    @noli 所以你的意思是系统把每个 app 分到不同 jail 里?
    noli
        33
    noli  
    OP
       2017-08-08 19:33:57 +08:00
    @hjc4869 严格来说是非系统应用,都在一个自己独占的 jail 里面。如果需要支持应用族的概念,可以同一个应用族的 App 放在同一个 jail 里面。应用和应用之间的通信,应用的网络通信,应用的本地存储,都由 jail 来监管。

    这是一种比较成熟的管理模型吧。

    cgroup 做这个感觉挺麻烦的。
    hjc4869
        34
    hjc4869  
       2017-08-08 19:34:57 +08:00
    @noli 那么作为一个自由的 OS,是不是要允许用户在 jail 外面运行代码?
    zhicheng
        35
    zhicheng  
       2017-08-08 21:43:26 +08:00
    @noli Linux 开源并没有 BSD 早。

    1, 沙盒这个东西是工程师开发出来的,没有并不等于不能有,这个东西并不难,苹果的人也不是菜鸡。况且 BSD 在 Darwin 系里只是一个子系统,核心思想还是 Mach 微内核系统,所以理论上在这个上面跑 BSD 还是跑 Linux,本身就没有多大关系(最后提供给 User Space 的都是 POSIX )。你说 iOS 成功是因为 BSD 真是完全不敢苟同。
    App 质量和 OS 关系不大,这个根本就不用我讲。你不能说跑在 BSD 系统上的 App 就是好,跑在其它系统上的就是垃圾。App 质量取决于开发这个 App 的团队有多用心。

    2, Google 用 Linux 原因很简单,Linux 比 BSD 从开发者数量到工具链等更成熟,这和他们为什么选 Java 一样。Google 的人不喜欢 GPL 但也没办法。

    3, 你这是典型 BSD 是最好的,Linux 就是垃圾的宗教心态。另外如果你现在不是是 Linux 内核开发者,那我建议你先成为 Linux 开发者,再提各种魔改 Linux 内核的事儿。另外这里的人,都不是你的典型客户,你也根本讨论不出来结果,那些 “无知” 的客户才是你的典型客户。

    4, 我当然分得清什么是锤子什么是钉子。

    BSD 系统和 Linux 系统,从市场上看,两者是替代品的关系。做项目选择基础组件,选的都是最合适性价比最高的,要以 “商人” 的心态做技术。

    如果你以看待宗教的方式看待技术,那根本就没有继续讨论的意义,因为在你眼里你永远是对的。
    noli
        36
    noli  
    OP
       2017-08-09 08:44:24 +08:00
    @zhicheng

    1. 我不知道你是哪一种类型的开发者,以及是怎么理解 sandbox 这种技术的细节。
    不过或许你可以告诉我一下,Android 如何在没有 linux kernel 的支持下开发出一个不能被开发者绕开的 sandbox ?
    你不会以为写任何 Android 或者 iOS 的 App 的时候,只能 link SDK 提供的标准库吧?
    如果能够绕开在 SDK 里面提供的 Sandbox,这种 sandbox 能作为商业 OS 推出市场吗?

    App 质量当然和 OS 关系不大。但讲事实讲良心,你觉得 Android App 质量是不是 Android 的生态系统惯出来的?
    iOS 成功当然不仅仅是因为 BSD,但事实就是 iOS 在 BSD 的基础上提供了很好的扩展。

    当然了,你说的 App 质量是在说个例,我说的 App 质量是在描述普遍水准。根本不是在说同一个事情。

    并且,iOS 还真不是 microkernel,顶多算是 hybrid

    2. 我部分同意你的说法。在当时,“ Linux 比 BSD 从开发者数量到工具链等更成熟”。
    然而这不能说明这不是一个偶然。
    这跟我今天选不选 Freebsd 或者 其他 BSD 甚至 Redox 什么的,并没有什么必然关系。
    当时的 BSD 系没有乘上开源的快车是造成了暂时落后的主要原因,但 BSD 系比 Linux 更老牌是事实。

    3. 并且 BSD 的 API 比 Linux 的更有前瞻性,继续以 kqueue VS epoll 为例,
    epoll 不能服务 file IO, 要另外使用 inotify, epoll 也不能支持 timerfd, signal fd ; kqueue 全包了, linux 弱鸡
    epoll_ctl 一次只能关注 一个 fd,你要关注 100 个,麻烦你发 100 次 系统调用; kqueue 一次搞定,linux 弱鸡

    我就不说 fs 上的其他了。你先告诉我说,Linux 在哪个细节上不比 BSD 垃圾吧。
    你这么推崇 linux,反倒说我宗教?同志您写过多少跨平台代码?

    “这里的人,都不是你的典型客户”。我可不敢小瞧天下英雄。
    虽然你没证明你是其中之一,不过起码还是能有有趣的讨论的。

    4. 空话我就不多说了。能不能先做一回小孩,只说对错,不讨论利益?
    noli
        37
    noli  
    OP
       2017-08-09 08:45:55 +08:00
    @hjc4869

    Q: 那么作为一个自由的 OS,是不是要允许用户在 jail 外面运行代码?
    A: 当且仅当 OS 规则默许或者 用户明确授权之后,允许 jail 外面的代码运行。
    hjc4869
        38
    hjc4869  
       2017-08-09 09:27:42 +08:00
    @noli 那么假如阿里给你的 OS 出了个支付宝,但是强迫用户允许其在 jail 外运行才能用呢?
    noli
        39
    noli  
    OP
       2017-08-09 09:30:29 +08:00 via iPhone
    @hjc4869 jail 可以做得到让客户 app 不知道自己 jail 里面的。
    hjc4869
        40
    hjc4869  
       2017-08-09 09:39:00 +08:00
    @noli 那假如阿里做了个内核模块用于检测呢?开放 OS,应该也允许用户自己插入内核模块吧?
    noli
        41
    noli  
    OP
       2017-08-09 10:46:07 +08:00
    @hjc4869

    那阿里干脆自己基于 Freebsd 改一个移动设备 OS 算了,事实上他们也是这么做的,YunOS 好像就是一个兼容了 Android 的,据说是从 BSD 改的。

    但显然,加了这么流氓的内核模块,破坏平衡的玩法,没人愿意跟他们玩。
    hjc4869
        42
    hjc4869  
       2017-08-09 10:47:47 +08:00
    @noli 你把自由交给了用户,你怎么知道用户不会为了用支付宝放弃自由?为什么那么多用户宁愿给通讯录权限也要用那些不给权限就闪退的 app ?其实是一个道理。
    hjc4869
        43
    hjc4869  
       2017-08-09 10:49:46 +08:00
    用户永远是弱势群体,这个做再好的 OS 也没法改变,区别只是被 app 开发商还是被 OS vendor 还是被 OEM 坑。
    noli
        44
    noli  
    OP
       2017-08-09 10:58:08 +08:00
    @hjc4869

    我不是很理解你说什么。

    用户当然永远是弱势群体,没有专业知识没有专业技能来保护自己的权益。用户当然也可以用人民币投票,要自由还是要支付宝。

    然而,我一直都在说的就是,提供一个 好的 OS 环境,能够双赢。
    iOS 上老老实实的支付宝就是一个实证,无论我们对这个事实的原因,甚至谁为因谁为果,有多大的争议。

    然后我提出了一个 iOS 之外保持开放性同时保证用户安全的提议,就是参考 FreeBSD jail 甚至直接从 FreeBSD 改。

    所以我不知道你那么悲观的,用户只能永远被坑的信念是哪里来的。也不是很理解你发表这种哀叹和我说的有什么关系。
    hjc4869
        45
    hjc4869  
       2017-08-09 11:07:59 +08:00 via Android
    @noli iOS 上支付宝的老实并不是因为 iOS 基于 BSD,或者系统上怎么怎么安全,而是因为其封闭性,app 不老实就得下架,用户根本用不了不老实的 app。

    你根本上就理解错了。
    noli
        46
    noli  
    OP
       2017-08-09 11:19:31 +08:00
    @hjc4869

    封闭性是什么?是诅咒吗?是超能力吗?还是物理法则?

    技术人就说技术话题,iOS 的封闭性就是要靠技术保证的。iOS 没有 Sandbox,或者有 Sandbox 但是像 Android 那样允许随随便便 Access 敏感数据,再多的审核也没有用。

    再更进一步,你有没有想过是不是只有审核才能保证 App 对用户隐私的安全性?

    你没有。
    你根本就不理解什么是封闭性开放性,你只是在用你自己不理解的名词组成一个句子。

    我不介意你反对我的观点,但是单方面输出你不加思考的成见,让我觉得你没有要讨论的诚意。
    hjc4869
        47
    hjc4869  
       2017-08-09 11:22:46 +08:00
    @noli 我觉得你的这个回复用来形容你自己再合适不过了。
    既然你都这么回答了,这个话题也没有继续讨论的必要了。
    祝你早日找到你的第一个客户,实现你的开放理想。
    hjc4869
        48
    hjc4869  
       2017-08-09 11:24:31 +08:00
    顺便,Android 的权限管理一点都不比 iOS 差,本质上 app 权限模型都是相同的,权限分的非常细,每个 app 能用什么 API,系统都能控制。你根本不理解 Android。
    noli
        49
    noli  
    OP
       2017-08-09 11:37:29 +08:00
    @hjc4869

    你很理解 Android,Android 什么权限都能控制,那你告诉我华为大战微信这么狗血的事情是怎么发生的呗。
    Android 权限控制很细致,我不否认,用 XML 定义的嘛。哈哈哈哈~

    没有二进制上的安全,任何其他安全机制都是虚的。
    这是我对安全的理解。

    如果你觉得你对 Android 安全的理解比我多,就拿出来吧。
    hjc4869
        50
    hjc4869  
       2017-08-09 12:03:24 +08:00 via iPhone
    @noli 你说的话让我觉得跟你谈我对操作系统的理解是严重的浪费时间。
    还是打住吧。
    zhicheng
        51
    zhicheng  
       2017-08-09 13:40:23 +08:00
    @noli 我还是那句话,你用宗教的心态去做技术,就已经没有讨论的必要了。

    Linux 和 BSD 是替代品,没有谁对谁错。如果你觉得用 BSD 就是对的,用 Linux 就是错的,请参考这个回复的第一条。

    苹果用 BSD 并不是直接把 BSD 拿来用,而是进行了大量的裁剪和定制,用 BSD 可以改,苹果用 Linux 就不会改了?并且据说苹果当年在做 Darwin 的时候优先考虑的是 Linux。Google 的 Linux 内核也是经过自己修改过的,sandbox 这个东西 Linux 本来就有第三方的实现,不是什么难到上天的技术。Mac 用 BSD 最多的其实是 User Space 的东西。两个是完全不一样的内核,如果你说 Darwin 不是完全的 microkernel 我同意,但你也不能说它不是 microkernel。苹果把两个技术融合到一起已经和 BSD 跟 Linux 不同了。

    我从来没有说我推崇 Linux,是你以为我在推崇 Linux。当然我的错误在于我以为你想讨论问题。如果你觉得 BSD 好,那你就坚持用好了。

    bottom line: 我既没说 BSD 不好,我也没说 Linux 好,我不认为这两个其中任何一个比另一个更好。技术都有自己的方向和市场策略。如果我要做一个通用的消费电子类的产品一定会用 Linux (尤其是以开放为卖点) 。如果我要做一个封闭的产品并且需要保密硬件参数和信息那我很可能会选 BSD。如果我要做一个以安全为主的产品,那我很可能会选择从一个 L4 分支中定制。
    noli
        52
    noli  
    OP
       2017-08-09 14:18:46 +08:00
    @zhicheng

    我至今没有理解,我哪个行为让你认为我是用宗教的心态做技术。然后又说锤子钉子,我也是 N 脸懵逼的
    你给我扣个帽子然后又在这层里面打帽子,让我觉得你的行为很无聊。

    不过没关系,我们可以抛开这些次要矛盾继续讨论。

    我先声明一下,我个人确实对 FreeBSD 观感甚好,对 jail 的概念比较欣赏。
    为了不让讨论的话题变成毫无意义的空中楼阁,我就把 FreeBSD 里面的 jail 机制以及其对 App 隔离的效果,作为一个参考模型来讨论。
    但我绝不认为这种程度的敬意,应该被理解为 BSD 宗教。

    当然,我还是坚持批判 Android 中的 Linux 权限机制的。
    Linux 并不是没有成型的好的安全模型实践,AppArmor 和 SELinux 都是两个比较老牌的,然而并没有受到多大的好评和关注。

    请注意,这就是我批评的重点,Linux kernel API 本身其实并没有多少 安全相关的。

    不像在 FreeBSD 中,jail 就是一个 kernel 的功能,现成的标准,不需要任何第三方实现,kernel 就有这样的功能。(当然 kernel 剪裁后是另外一回事)。

    由于 linux kernel 对 应用隔离 关注度不高,所以我认为 linux 内核社区这么做是短视和肤浅的。

    如果这个批评仍觉得勉强,那 cgroup 和 lxc 之后的 docker,关注的依然是 运维部署隔离 着手的便捷性,而不是面向普通用户比较关注的 app 数据安全。
    据此,我的看法是,Linux 社区以及基于 linux 上的 Android 并不是一个真正关心像手机用户这样的使用场景的用户。

    如果你觉得这样的批评冒犯了你,那言尽于此吧——尽管你不承认,但在我看来这就是 linux 洗脑教。

    理论上来说,任何一个 kernel 集成任何一种 sandbox 机制,都不是难上天的事情。开源的软件嘛,有无限的可能。
    唯一阻止这些可能的,就是开源社区里的人,是人们的想法和偏好选择,导致了不一样的开源软件之间有差异。

    Linux 社区声称自己最有黑客精神,什么都可以搞什么都可以实现。
    但是结果是搞什么都搞个半桶水,桌面是这样,手机系统也是这样。

    我只是比较不客气认为 linux 社区充满了短视和狂热而已。

    回归主题:

    如果 @zhicheng 你要做 多样性和开放性的同时,保证用户数据的安全性,符合你说的消费类移动设备的 OS
    那样怎么改嘛?

    我觉得 FreeBSD 的 Jail 是值得参考的模式。
    你认为改一个 安全机制很容易,麻烦你提个建议吧。
    noli
        53
    noli  
    OP
       2017-08-09 14:26:16 +08:00
    @hjc4869

    顺带补充一个,binary code sign 是任何一个支持像 App Store 这样的分发安装第三方应用 OS 所必须考虑的基本内核功能。Linux 内核曾经有过 DigSig,但是后来也没当回事了。

    说实话,连这样的 bin 分发数据安全保证都没有,Linux 以及经基于 Linux 的 Android 谈安全,简直就是自欺欺人。

    当然,讲真,FreeBSD 也没有。
    幸好 iOS 和 WP 都有呢。
    hjc4869
        54
    hjc4869  
       2017-08-09 14:49:35 +08:00
    @noli apk 有签名。
    Linux 确实不注重安全,但并不代表所有 Linux-based 的 OS 都不能做到安全。
    对于 modern app model,一般都是签名整个包,而不是签名其中的 binary,包括 Windows 的 UWP apps 现在也是这样做。Android 在这一点上并没有缺陷。
    hjc4869
        55
    hjc4869  
       2017-08-09 14:53:15 +08:00
    另外,Linux Desktop 的包管理器也是签名整个包。
    zhicheng
        56
    zhicheng  
       2017-08-09 15:13:40 +08:00
    @noli 你可以参考 Android,它有数亿的安装量。当然你觉得 Android 是垃圾。

    其实下面的话我并不想说,但你用了反问句,那我也要用几个反问句。

    为什么用 Linux 就不能实现“多样性和开放性的同时,保证用户数据的安全性”?
    为什么不用 jail 就不能实现“多样性和开放性的同时,保证用户数据的安全性”?
    为什么从功能机时代就没有一家商业公司使用 FreeBSD 作为移动操作系统?
    为什么 Google 和 IBM 甚至微软向 Linux 投入巨大的人力物力?
    为什么苹果没有使用 jail 作为 sandbox 的实现?

    我还是那句话,我是来讨论技术的,不是来站队的。你没必要攻击我,或者你攻击我 FreeBSD 也不会一夜之间取代 Linux。你说 Linux 短视和狂热,我代表不了 Linux 不去反驳你。但我从你身上看到了 FreeBSD 的狂热。

    站在我的角度,sandbox 真不是难的上天的技术,操作系统内核本身也不是难的上天的东西,那么多科学家做了那么多研究,也有那么多的工业系统的实践,就是会让一个技术变得越来越简单。

    多研究技术,少谈些主义。你要是有能力用 FreeBSD 做移动系统,那就做一个比 Android 更好的让别人闭嘴,没准到时候 Google 还会投给你几十亿美金。
    noli
        57
    noli  
    OP
       2017-08-09 15:33:39 +08:00
    @hjc4869

    Android 的 APK 是有签名,可惜的是 Android 并不阻止内存页成为可执行区
    也就是说,下载一段外来的代码 JIT 成 bin 后可以执行。
    那么任何 APK 签名都是摆设,只要注入攻击者的代码就可以改变 App 原作者期望的行为。
    进而冒充 原 App 开发者的功能欺骗用户。
    简单来说就是中间人攻击 + 注入。
    又,Android 由于丑陋的权限设计( UX 不佳也有很大功劳),用户为图方便动不动就 root,以 root 身份执行注入的恶意代码,简直爽得不能再爽,
    什么安全设计都白费。
    最近好了点,各大 ROM 终于醒悟。后门不光自己能用,也能被别人爆菊,不再轻易提供 root

    iOS 只允许 JS JIT 并且 JS 也只允许从持有开发者指定的 HTTPS 网站上下载。
    可以很大程度保证,JIT 出来的 bin 是 app 原开发者想要的行为。
    虽然 iOS 这么干比较怂,但好歹还是保护了用户和开发者的。
    再加上原本的沙盒,能够较大程度确保 App 和用户数据 的安全。

    如果按照严格执行 jail 的模型,把 静态 APK 以外的 JIT 出来的 bin 放在 子 jail 中执行,根本就不需要担心。
    开发者可以借助系统或者第三方 SDK 来校验,JIT 出来的功能是否就是自己注入的功能,而不是其他人注入的。
    这样不光 JS 可以 JIT (借助 HTTPS 证书验证),任何其他语言都可以 JIT。

    在这点上 .net 的模型可能是最安全的,因为每一个 assembly 包括动态从外界获取的分发版本,都可以让开发者签名。也就是所谓的 binary 级别的 code sign。
    noli
        58
    noli  
    OP
       2017-08-09 16:04:58 +08:00
    @zhicheng

    我觉得我们对“能”字的理解有差异。

    在你看来,假设你说 Linux 是“万能” 的,你的“能”字是“应然”。我同意,Linux 可以改造成任何想要的样子和功能,理论上它没有任何先天限制或者不足。

    但我认为 Linux 在消费者级别的用户面前是“无能”的,我的“能”是“实然”。譬如说,Linux 比起 Windows 比起 MacOS X 不能提供一个稳定易用的桌面,基于 Linux 的 Android 不能保证用户数据安全和 App 开发者的数据安全。

    所以我这样回答你的问题:

    Q: 为什么用 Linux 就不能实现“多样性和开放性的同时,保证用户数据的安全性”?
    A: Linux 应该可以做到但现在没有做到,但鉴于很多其他 Linux Alternative,例如 iOS, FreeBSD 已经做到了,参考已经做到的,不是一个更好的选择吗?

    Q: 为什么不用 jail 就不能实现“多样性和开放性的同时,保证用户数据的安全性”?
    A: 我并不否认 jail 以外的安全机制能够实现,就好像我没有排除过 AppArmor 或者 SELinux 或许可以。但是他们不如 jail 的实践经验丰富以及方案成熟。更重要的是,AppArmor 和 SELinux 并不是 Linux 主流,只是部分厂商维护的功能。但 jail 不是。

    Q: 为什么从功能机时代就没有一家商业公司使用 FreeBSD 作为移动操作系统?
    A: 问题不成立,阿里的 YunOS 是 FreeBSD 改,PS 上面的 OS 是 FreeBSD 改,2 楼的网友回复已经说过了。他们没有声称是 FreeBSD 是 BSD 协议的原因。

    Q: 为什么 Google 和 IBM 甚至微软向 Linux 投入巨大的人力物力?
    A: 我在 31 楼 给出过我的回答,我复述一遍:GPL 也是一个让大公司愿意投入的因素——因为保证了自己的投入不仅仅是为竞争对手做嫁衣,而且保证竞争对手的投入也可以为自己所用。 这是 GPL 在法律上保证他们安心协作的原因,然而这不是一个技术问题而是一个法律问题或者政治问题,不能说明 Linux (的代码、功能)优秀。

    加点私货:OpenSolaris 如果活了下来,Linux 算个毛啊,Sun 对 Solaris 的投入也不小,能说明什么吗?

    Q: 为什么苹果没有使用 jail 作为 sandbox 的实现?
    A: 因为苹果不需要开源,iOS 也不是一个开放的系统,App Store 需要审核才能发布 App,所以不需要 jail 能提供的灵活程度。但是我想做一个开放的系统。
    hjc4869
        59
    hjc4869  
       2017-08-09 16:07:36 +08:00
    @noli 如果是 app 自己不注意导致的 RCE,那么对 iOS app 同样有效。iOS 虽说系统不让你乱调用 mprotect,但是开发商如果不怕审核不过,还是可以自己嵌入一个解释器,比如纯 C 写的 python,如果用了这些东西还不注意自己校验完整性,一样被劫持就 RCE,想干啥就干啥。
    iOS 对 JS 的规定也是靠审核而不是系统安全级别的技术实现的。前段时间那么多 app 用 JSPatch 被下架,都是这个道理。
    noli
        60
    noli  
    OP
       2017-08-09 16:33:30 +08:00
    @hjc4869

    并不是你说的那个道理。

    iOS 本身就允许你自己嵌入类似 python 解释器,lua 解释器,并不违反上架要求。大量游戏都是用 lua 脚本并且 热更新的,你觉得他们是怎么上架的?

    但是包括 pypy,luajit,CLR 等等这些是不可以的。

    因为解释器能够调用的系统 API 是可以静态检查的,在链接的时候已经写死了,肯定可以检查出是不是有用到私有 API 或者敏感的功能。不开放出来的系统 API 一样调用不了,调用了就不让上架。

    但是 JIT 出来的 code 是无法静态检查的而动态检查代价太大。
    并且可以绕过 iOS 上架审核并调用 私有 API,那么 iOS 的审核也就废掉了。

    JSPatch 之所以被禁是因为后面这一点,JIT 出来可以调用 私有 API 的东西,例如运行时注入修改函数入口地址。
    这个才是 JSPatch 被禁止的原因。
    实际上,iOS 的 JavascriptCore 也是 JIT,但因为这是 苹果自己的实现,肯定不会调用自己的私有 API,所以可以放心提供给开发者。

    苹果如果真的用了 jail,那么什么私有 API 调用根本就不是问题,到内核那里就防住了。

    所以你的说法“ iOS 对 JS 的规定也是靠审核而不是系统安全级别的技术实现的” 就是错的,App Store 审核才不看源代码,都是二进制级别的检查。
    hjc4869
        61
    hjc4869  
       2017-08-09 17:07:28 +08:00
    @noli 你不理解 ObjC 和水果那一套东西。编译出来全是动态调用。
    举个例子
    [[NSString alloc] init];
    翻译成 C 代码就是
    void* cls = objc_getClass("NSString");
    void* obj = objc_msgSend(cls, NSSelectorFromString(CFSTR("alloc")));
    obj = objc_msgSend(obj, NSSelectorFromString(CFSTR("init")));
    hjc4869
        62
    hjc4869  
       2017-08-09 17:15:16 +08:00
    JSPatch 并没有调用私有 API,只是用了上面我说的这几个函数去实现了任意 API 调用
    zhicheng
        63
    zhicheng  
       2017-08-09 17:20:10 +08:00
    @noli 既然在 “讨论” BSD 和 Linux,就不要把 Windows 扯进来,不能我跟你讨论 BSD 和 Linux 的时候你突然来了句 Linux 不如 Windows。这个不是讨论的内容。或者用你的观点,把 Linux 换成 FreeBSD 也成立,更可怕的是 Linux 桌面现在已经比较稳定了,FreeBSD 呢?

    不是 Linux 是万能的,而是工程师是万能的,而 Linux 充当了中间的桥梁,它对于很多项目是一个定制化非常高的框架。

    iOS 不是 FreeBSD,真的不是。从单纯的 syscall 的角度,FreeBSD 和 Linux 是完全一样的产品,谁都没有优越感。或者 Linux 更好一些,因为更容易定制。

    我根本就不知道你说的“安全 API ”是个什么鬼东西。

    Linux 就是给别人一种多样性让大家自己开发或者选择,而不是官方定调你只能用这个,比起那些老牌或者正统 UNIX,Linux 更像是集市,谁的东西好,谁就卖的好。

    我并不知道 YunOS 是基于 FreeBSD 也没有搜到任何证据。不过还是感谢你没提 Kylin。你不用复述一遍关于 GPL 以及大企业的言论,事实是大企业非常讨厌 GPL,但是 Linux 深得民心他们也没有办法。

    你还是别加私货了,OpenSolaris 在当时不可能活下来,现在也不可能活下来,未来也不可能活下来。很多人相信 Solaris 神话,但其实 Solaris 是一个更新慢,运行慢,漏洞多,不开放的系统。它有很多很先进的功能,但最后还是没活下来,OpenSolaris 想披一套 GNU 的皮复活,但一个没有经过市场验证又是由一家公司把持的项目,大家并不买账。

    重复一下 bottom line: FreeBSD 是一个很好的 OS,Linux 也是一个很好的 OS。他们两个是替代品,各有各的市场和策略,任何一个都不比另一个好。不要用 FreeBSD 就是比 Linux 好,用 FreeBSD 就是对,Linux 就是错这种 “清真主义” 来评价技术。
    hjc4869
        64
    hjc4869  
       2017-08-09 17:31:04 +08:00
    另外水果对 JSPatch 的处理方法简直就是在搞笑,“扫描字符串”直接拒绝审核
    noli
        65
    noli  
    OP
       2017-08-09 17:36:56 +08:00
    @hjc4869

    void* cls = objc_getClass("NSString");
    void* obj = objc_msgSend(cls, NSSelectorFromString(CFSTR("alloc")));
    obj = objc_msgSend(obj, NSSelectorFromString(CFSTR("init")));

    你说的这些明明就是平铺直白的 C 函数静态调用。当然对于某种语言来说它可能是什么动态调用,但在 loader 看来,这些函数的入口在编译后就是明确的、固定的,所以就是 静态调用。

    我说的是在运行时 生成一个函数,并把这个函数的入口地址放入某个寄存器后跳转执行。

    跟 JSPatch 有没有直接调用私有 API 没有关系,有关系的是可以在生成的函数里面去调用私有 API。

    https://jspatch.com/Docs/appleFAQ
    noli
        66
    noli  
    OP
       2017-08-09 17:39:50 +08:00
    @hjc4869

    无论你怎么理解 Apple 的审核行为,你对注入二进制代码的动态调用理解是错误的。
    iOS 并不拒绝动态执行 script 代码,拒绝的是动态执行任意二进制代码。
    hjc4869
        67
    hjc4869  
       2017-08-09 17:41:16 +08:00 via Android
    @noli 问题是被调用的是 NSString.alloc NSString.init,这些是作为变量被送入,objc_xxx 调用的是什么跟输入的变量有关,这就叫做 dynamic dispatch。
    意思就是只要脚本可以调用 objc_xxx 这些函数,就能调用包括 NSString 在内的一切 objc native api。后者都是动态的,静态检查不出来。
    hjc4869
        68
    hjc4869  
       2017-08-09 17:49:44 +08:00 via iPhone
    @noli
    除了 JSPatch,甚至还有人做了把 objc 编译成字节码,然后解释运行。
    动态调用根本不需要 JIT,有一个解释器就行。
    类似的技术还有 Microsoft COM,纯 native,但是就是可以用解释器动态调用( IDispatch )。

    另外,你能不能不要随便说别人的理解是错误的?你看看上面从我说打住封闭 /开放的话题开始,我纠正了你多少技术方面错误的认知?如果我是王垠,上面每个回复都是建议零售价 30 元的。
    noli
        69
    noli  
    OP
       2017-08-09 17:49:44 +08:00
    @zhicheng

    你怎么定义 “ linux 桌面比较稳定” 我不管,你认为 linux 怎么先进我不管,
    你告诉我哪个版本的 Linux kernel 有 类似 FreeBSD jail 的 设施,
    你告诉我哪个版本的 Linux 可以支持判断某个 bin 是某个开发者开发的。

    要不是 linux 最近终于想起 跟进 DTrace,我还想问问你 linux 什么时候打算支持这个。

    当我说前瞻性的时候你跟我说实现,当我说实现的时候你跟我说可能性。


    你不想或者不能好好讨论就闭嘴吧,感谢你的铜币了。
    noli
        70
    noli  
    OP
       2017-08-09 17:59:15 +08:00
    @hjc4869

    什么时候 objc 编译成中间字节码是新鲜事了,LLVM IR 不就是干这个的吗,clang 不就是搞这些的吗?
    objc 的几乎每个调用都会编译成 objc_msgSend 这是常识吧?

    如果你知道 objc_msgSend 是怎么实现的,你就明白为什么这些都是静态调用了,
    以及为什么你说的我说的 二进制代码 注入是两回事。

    objc_msgSend 传入一个字符串进去,要调用的函数的入口就已经确定了,
    这些函数都是 objc runtime 动态链接到当前进程的时候就已经设置好入口地址了,可以调用任意函数确实是和 JIT 无关,而且 Apple 也可以检查得出来。

    然而这些都不是 JSPatch 被禁的原因。
    noli
        71
    noli  
    OP
       2017-08-09 18:02:01 +08:00
    @hjc4869

    “纠正了你多少技术方面错误的认知”。
    无知真是可怕。

    显然我和你之间要么误会深得无法解开,要么就是其中一个是无知而不自知。
    算了。结帖了。已经离题万丈了。
    hjc4869
        72
    hjc4869  
       2017-08-09 18:03:27 +08:00 via Android
    @noli 你 objc_msgSend 输入一个字符串*变量*,编译时谁知道你要调用啥?
    VmuTargh
        73
    VmuTargh  
       2017-08-09 18:15:24 +08:00
    第一次听到斗地主还可以三个人都赢牌的套路
    noli
        74
    noli  
    OP
       2017-08-09 18:38:17 +08:00
    @hjc4869 呐,我帮你提高姿势水平,这次 30 块就当免费体验优惠了。

    三种情况:

    1. 字符串变量编译时可以确定,也就是说直接存储在数据段,所以这个时候肯定可以查到要调用哪个函数
    从 objc 源码编译得到的 bin 调用都大多数是这种类型,因为要 send 的 msg 在编译时确定,这里包括所谓的 dynamic dispatch,其实只不过是用字符串作为 key 取代 C++ vtable (用 index 作为 key )

    2. 字符串变量编译时不确定,但肯定是某个 objc 的函数, 这时候可以通过一遍模拟加载知道所有 在 objc runtime 中注册的类,如果在进入 main 之前没有被加载,那么进入 main 之后也不会被使用。这一步的检测普通开发者不一定做得到,但是 loade 人完整实现得 Apple 肯定可以做得到。

    这里 jspatch 已经有越界的风险了,因为 可以用自定的 函数入口 来改掉 iOS SDK 原本函数的入口。

    更进一步,可以猜测 私有 API 的入口地址做跳转。当然我不确定 JSPatch 有没有这么做,据我所知 iOS 好像没有随机更改 dll 中的入口函数地址以避免被猜测的功能( Windows 上肯定有,作为一种安全防范),所以即使 JSPatch 没有这么做,其他人完全可以通过 JSCore 来做到这种效果,JSPatch 也控制不了。

    所以,如果 JSPatch 只是老老实实地把 JS 代码翻译成 objc_msgSend 是肯定不会被禁的,这已经足够实现所谓的 热更新了。

    如果改掉 iOS SDK 调用入口,甚至尝试通过猜测入口来调用私有 API 的话,就肯定会被禁。

    事实上,甚至可以通过混淆字符串,来调用 私有 API,原理你知道的,只要在真正调用 objc_msgSend 之前生成原本要调用的私有 API 字符串,就可以实现了。
    noli
        75
    noli  
    OP
       2017-08-09 19:05:59 +08:00
    @VmuTargh 说明按照斗地主的模型来梳理三者关系可能不太对。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5518 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 88ms · UTC 07:16 · PVG 15:16 · LAX 23:16 · JFK 02:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.