Das ist wenig Zielführend, dashat Ubiquiti (wenn auch extrem billig) mit voller Absicht eingebaut. Neuere Modelle haben auch Signatur-verifikation im Bootprozess aktiv, welchen UBNT selbstverständlich aber auch nur halbherzig implementiert hat und deswegen (bisher) kein großes Hindernis darstellt.
Wer sich dafür interessiert, das habe ich damals hier Zusammengeschrieben: ramips: add support for Ubiquiti UniFi 6 Lite · openwrt/openwrt@fb4d7a9 · GitHub
Dieses mal haben sie ihren eigenen Write-Protext gebaut. Am Kernel image hängt ein DTB, welches den write-protect status der partitionen angibt:
/dts-v1/;
/ {
ubnthal {
write-protect {
compatible = "ubnthal,write-protect";
default-write-policy = "ro";
explicit-write-policy {
mtd {
partition@0 {
label = "u-boot-env";
write-policy = "rw";
};
partition@1 {
label = "bs";
write-policy = "rw";
};
partition@2 {
label = "cfg";
write-policy = "rw";
};
};
};
};
};
};
Das Kernel-Modul ubnthal.ko parsed dieses und flagged die MTD partitionen entsprechend als read-only.
Das Kernel Modul stellt im procfs ein file bereit, welches mit der richtigen magic beschrieben alle partitionen unprotected. Hierüber bedient auch das ubntbox binary und damit fwupdate.real den write-protect status der partitionen. Das magic ist allerdings statisch, Ubiquiti war aber der Meinung das ganze ist effektiver, wenn man dieses File ausblendet
.
Beschreibt man das File mit dem korrekten Wert öffnet sich auf magische Art und Weise der Write-Protect von kernel0 und kernel1 und wir können OpenWrt / Gluon wie bisher installieren.
UAP-AC-Lite-BZ.6.2.35# cat /proc/mtd
dev: size erasesize name
mtd0: 00060000 00010000 "u-boot"
mtd1: 00010000 00010000 "u-boot-env"
mtd2: 00790000 00010000 "kernel0"
mtd3: 00790000 00010000 "kernel1"
mtd4: 00020000 00010000 "bs"
mtd5: 00040000 00010000 "cfg"
mtd6: 00010000 00010000 "EEPROM"
UAP-AC-Lite-BZ.6.2.35# cat /sys/class/mtd/mtd2/flags
0x800
UAP-AC-Lite-BZ.6.2.35# cat /sys/class/mtd/mtd3/flags
0x800
UAP-AC-Lite-BZ.6.2.35# echo "5edfacbf" > /proc/ubnthal/.uf
UAP-AC-Lite-BZ.6.2.35# cat /sys/class/mtd/mtd2/flags
0xc00
UAP-AC-Lite-BZ.6.2.35# cat /sys/class/mtd/mtd3/flags
0xc00
UAP-AC-Lite-BZ.6.2.35# dd if=/
UAP-AC-Lite-BZ.6.2.35# mv /tmp/gluon-ffda-2.6.0-ubiquiti-unifi-ac-lite-sysupgrad
e.bin /tmp/firmware.bin
UAP-AC-Lite-BZ.6.2.35# dd if=/tmp/firmware.bin of=/dev/mtdblock2
11777+1 records in
11777+1 records out
UAP-AC-Lite-BZ.6.2.35#
UAP-AC-Lite-BZ.6.2.35# dd if=/tmp/firmware.bin of=/dev/mtdblock3
11777+1 records in
11777+1 records out
UAP-AC-Lite-BZ.6.2.35#
UAP-AC-Lite-BZ.6.2.35# dd if=/dev/zero bs=1 count=1 of=/dev/mtd4
1+0 records in
1+0 records out
UAP-AC-Lite-BZ.6.2.35# reboot
Ich bin mir nicht sicher, was Ubiquiti mit diesem Versteckspiel bezwecken möchte. Wenn es das ist was ich glaube, so hat der Abend mein Vertrauen in deren Softwareerzeugnisse einmal mehr deutlich herabgestuft. Aber hey, gut für uns.