Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Is it possible to disable secureboot persistently? #5

Open
hicode002 opened this issue Dec 8, 2024 · 4 comments
Open

Is it possible to disable secureboot persistently? #5

hicode002 opened this issue Dec 8, 2024 · 4 comments

Comments

@hicode002
Copy link

你好,我看到了你的研究,感觉非常有意思。目前我打算在华为使用msm8937或者msm8953的设备上复刻。我的目标很简单,就是以EL2加载内核,启动KVM和主线linux。但是有一个很大的缺点是每次重启设备都需要重新连接usb进入edl。有没有一种办法可以修补负责关机的程序,让设备在关机时保留给内存供电,这样下次开机时还是使用修补后的PBL?你可以直接说中文。
Hello, I have seen your research and find it very interesting. Currently, I plan to replicate on Huawei devices using MSM8937 or MSM8953. My goal is simple, which is to load the kernel with EL2, start KVM and mainline Linux. But there is a big drawback that every time the device is restarted, it needs to reconnect to USB and enter EDL. Is there a way to patch the program responsible for shutting down, so that the device retains power to the memory during shutdown, and the patched PBL will still be used during the next boot?

@fxsheep
Copy link
Owner

fxsheep commented Dec 9, 2024

TLDR:理论上可行,实际上很难;即使能够实现,也不一定具有实用价值。

首先,PBL补丁是通过修改页表映射实现的,修补后的PBL随着设备启动就消失了。但是,通过将关机替换为深度休眠来实现保留代码执行权限的思路是可行的。

如果你有能力:
1.修补关机程序可以通过修改EL3(TZ)来拦截HLOS的关机操作
2.不一定要保留DDR供电,可以尝试将SoC关闭到最小状态,保留一个程序在SRAM运行,关闭全部APSS,只保留RPM等待电源键事件

实际上,关闭到最小状态相对容易,从这个状态重新启动就相当困难了。我尝试过使用Reset Debug功能但是没能成功。

另外,“深度休眠”状态下功耗怎样也很难说,对于这种大型SoC来说,很可能和常规待机差不了多少。所以很可能最终成功了也意义不大。

@hicode002
Copy link
Author

TLDR:理论上可行,实际上很难;即使能够实现,也不一定具有实用价值。

首先,PBL补丁是通过修改页表映射实现的,修补后的PBL随着设备启动就消失了。但是,通过将关机替换为深度休眠来实现保留代码执行权限的思路是可行的。

如果你有能力: 1.修补关机程序可以通过修改EL3(TZ)来拦截HLOS的关机操作 2.不一定要保留DDR供电,可以尝试将SoC关闭到最小状态,保留一个程序在SRAM运行,关闭全部APSS,只保留RPM等待电源键事件

实际上,关闭到最小状态相对容易,从这个状态重新启动就相当困难了。我尝试过使用Reset Debug功能但是没能成功。

另外,“深度休眠”状态下功耗怎样也很难说,对于这种大型SoC来说,很可能和常规待机差不了多少。所以很可能最终成功了也意义不大。

嗯嗯。另外我还有一个问题,为什么修补之后无法启动emmc中的内核,而必须使用sd卡?按理来说emmc的供电已经有了,怎么会没法访问呢?

@fxsheep
Copy link
Owner

fxsheep commented Dec 12, 2024

这个也是我一直没解决的疑问了...
可以看到AlephSecurity的原文 https://alephsecurity.com/2018/01/22/qualcomm-edl-5/
他们也没有解决ugglite上的emmc问题,但是在nokia上却没有遇到这个问题。
这个问题很玄学,这个项目能在land上工作都很玄学。我一开始选择基于lk开发的原因之一就是想利用其mmc函数干净地反初始化emmc,事实上确实有效,因为我过了PBL,而Aleph在PBL里就挂掉了;但是我在SBL1里依然会挂掉,于是我花了很多时间折腾这个问题(可以看到lk4edl里那么多的分支...),甚至想过绕过SBL1自己手动启动平台,但是还是太难了...最后我发现有几个版本的SBL1其实是能工作的,所以就用那个版本了;但是内核是无论如何都没法初始化emmc的,所以当时不得不切到sd卡上。同时,为了不破坏原版的emmc底层(能在不用USB的情况下正常启动),也不大量魔改SBL1,我就干脆把整个boot链子都搬到了sd卡上(qcom的SBL1是原生支持从sd卡启动的,一行代码都不用改,只不过mi签名的aboot不支持,所以原版固件做不到完全放sd卡上跑罢了)。

总结一下,目前我所了解的情况是:

  1. BootROM在用lk的函数反初始化emmc后,是可以再初始化并访问emmc的
  2. SBL1仅有部分版本正常工作
  3. aboot/lk一直可以正常读取emmc(包括刚刚从EDL夺权以后,和从SBL1再次引导时)
  4. kernel一直不能初始化emmc(至少3.18和4.9都是不行的,后面我就没关注了)

还有一点:我尝试过两个land,emmc vendor分别是Samsung和Toshiba,问题完全一致,因此基本可以排除emmc本身的问题。
和电源关系应该也不大,因为lk一直可以访问emmc。

其他情况我就不清楚了,也记不清了。

我的猜测只能是某些寄存器的配置在EDL启动路径上和正常启动不一样,并且它还不会被常规的block asynchronous reset之类的局部复位给清掉,导致后面的重新引导路径都受影响。但是我甚至手动对比过寄存器也一直没找到问题在哪。Nokia的底层版本、EDL版本和电路设计的组合或许刚好避开了这个问题。

如果你用emmc启动的话其实也有很多问题要解决,比如原版SBL1如何与patch版共存,可以改分区GUID但是也很麻烦;另外,原版的底层是不能删的,因为我试过,如果SoC冷启动直接进EDL,然后执行lk4edl的启动路径的话,后面的SBL1会直接甩进9008,具体什么情况我也不清楚,总之肯定又是某些模块的寄存器初始化的问题。

另外,其实KVM也一直是一路坎坷,在3.18内核上用qemu-kvm启动WoA到内核阶段会直接导致主机重启(UEFI阶段不会),主机内核应该是报了一个data abort。3.18的kvm启动Linux倒是没问题。不过4.9上两个都不行了,很无语。我记得最后我用一个配置启动过WoA,但我已经忘记当时怎么配的了。毕竟我是强行把主机内核改到EL2的,而8937原本底层是不用HYP,所以TZ估计根本没有考虑过EL2,出各种问题也不意外。

平台大了,底层也不开放的情况下,玄学问题会很多。这个问题最彻底的解决办法,大概就是了解清楚启动的细节,然后实现一个开源的SBL1罢,不过我在放弃land和qcom的兴趣之前,都一直没能实现它。8937本来就是各厂的secboot刚普及的那几代平台,况且mainline kernel的支持一直不是很有希望,我建议对底层感兴趣的话还是去玩8916吧...甚至还能从sd接口连jtag呢...

@hicode002
Copy link
Author

hicode002 commented Dec 13, 2024

这个也是我一直没解决的疑问了... 可以看到AlephSecurity的原文 https://alephsecurity.com/2018/01/22/qualcomm-edl-5/ 他们也没有解决ugglite上的emmc问题,但是在nokia上却没有遇到这个问题。 这个问题很玄学,这个项目能在land上工作都很玄学。我一开始选择基于lk开发的原因之一就是想利用其mmc函数干净地反初始化emmc,事实上确实有效,因为我过了PBL,而Aleph在PBL里就挂掉了;但是我在SBL1里依然会挂掉,于是我花了很多时间折腾这个问题(可以看到lk4edl里那么多的分支...),甚至想过绕过SBL1自己手动启动平台,但是还是太难了...最后我发现有几个版本的SBL1其实是能工作的,所以就用那个版本了;但是内核是无论如何都没法初始化emmc的,所以当时不得不切到sd卡上。同时,为了不破坏原版的emmc底层(能在不用USB的情况下正常启动),也不大量魔改SBL1,我就干脆把整个boot链子都搬到了sd卡上(qcom的SBL1是原生支持从sd卡启动的,一行代码都不用改,只不过mi签名的aboot不支持,所以原版固件做不到完全放sd卡上跑罢了)。

总结一下,目前我所了解的情况是:

  1. BootROM在用lk的函数反初始化emmc后,是可以再初始化并访问emmc的
  2. SBL1仅有部分版本正常工作
  3. aboot/lk一直可以正常读取emmc(包括刚刚从EDL夺权以后,和从SBL1再次引导时)
  4. kernel一直不能初始化emmc(至少3.18和4.9都是不行的,后面我就没关注了)

还有一点:我尝试过两个land,emmc vendor分别是Samsung和Toshiba,问题完全一致,因此基本可以排除emmc本身的问题。 和电源关系应该也不大,因为lk一直可以访问emmc。

其他情况我就不清楚了,也记不清了。

我的猜测只能是某些寄存器的配置在EDL启动路径上和正常启动不一样,并且它还不会被常规的block asynchronous reset之类的局部复位给清掉,导致后面的重新引导路径都受影响。但是我甚至手动对比过寄存器也一直没找到问题在哪。Nokia的底层版本、EDL版本和电路设计的组合或许刚好避开了这个问题。

如果你用emmc启动的话其实也有很多问题要解决,比如原版SBL1如何与patch版共存,可以改分区GUID但是也很麻烦;另外,原版的底层是不能删的,因为我试过,如果SoC冷启动直接进EDL,然后执行lk4edl的启动路径的话,后面的SBL1会直接甩进9008,具体什么情况我也不清楚,总之肯定又是某些模块的寄存器初始化的问题。

另外,其实KVM也一直是一路坎坷,在3.18内核上用qemu-kvm启动WoA到内核阶段会直接导致主机重启(UEFI阶段不会),主机内核应该是报了一个data abort。3.18的kvm启动Linux倒是没问题。不过4.9上两个都不行了,很无语。我记得最后我用一个配置启动过WoA,但我已经忘记当时怎么配的了。毕竟我是强行把主机内核改到EL2的,而8937原本底层是不用HYP,所以TZ估计根本没有考虑过EL2,出各种问题也不意外。

平台大了,底层也不开放的情况下,玄学问题会很多。这个问题最彻底的解决办法,大概就是了解清楚启动的细节,然后实现一个开源的SBL1罢,不过我在放弃land和qcom的兴趣之前,都一直没能实现它。8937本来就是各厂的secboot刚普及的那几代平台,况且mainline kernel的支持一直不是很有希望,我建议对底层感兴趣的话还是去玩8916吧...甚至还能从sd接口连jtag呢...

嗯嗯,感谢。
msm8916华为的设备都没secure boot,那个我已经跑起来mainline linux和kvm了,但是硬件配置太低,16gemmc+1/2g内存,主频也太低了。
我其实就是想给高通零售机开启KVM,啥soc都不重要,但是更新一点的好像更难开了,也不知道pkvm能不能用。另外其实高通搞不起来搞华为麒麟的也行,因为华为麒麟fastboot还是以EL3运行的,而且他的980之前的下载模式可以随便传工厂fastboot,但是资料太少了,所以还是想搞高通的。
另外我觉得华为的sbl不一定能从sd卡启动,因为华为的sbl修改的太厉害了,甚至把9006都去掉了,还加了对oeminfo的读取以及sd卡升级的一些代码,当然实际上如果aboot损坏从sd卡也无法执行升级。
可不可以留个联系方式,我想探讨一下技术细节,我昨晚先提取了PBL,也反编译了,但是后面那几步ROP我没太清楚。
我的邮箱[email protected],也可以qq交流,感谢感谢!!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants