firmware
This commit is contained in:
parent
ab2f46c883
commit
57ddf8212f
|
|
@ -2,7 +2,36 @@
|
||||||
include 'header.php';
|
include 'header.php';
|
||||||
|
|
||||||
exec("sudo chmod 444 /sys/class/dmi/id/product_uuid");
|
exec("sudo chmod 444 /sys/class/dmi/id/product_uuid");
|
||||||
$version = 1.0;
|
$version = 1;
|
||||||
|
|
||||||
|
function fail(string $msg): never
|
||||||
|
{
|
||||||
|
fwrite(STDERR, "ERROR: $msg\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function download(string $url, string $dest): void
|
||||||
|
{
|
||||||
|
$fp = fopen($dest, 'wb');
|
||||||
|
if (!$fp) fail("Cannot write $dest");
|
||||||
|
|
||||||
|
$ch = curl_init($url);
|
||||||
|
curl_setopt_array($ch, [
|
||||||
|
CURLOPT_FILE => $fp,
|
||||||
|
CURLOPT_FOLLOWLOCATION => true,
|
||||||
|
CURLOPT_FAILONERROR => true,
|
||||||
|
CURLOPT_TIMEOUT => 60,
|
||||||
|
CURLOPT_SSL_VERIFYPEER => true,
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (!curl_exec($ch)) {
|
||||||
|
fail("Download failed: " . curl_error($ch));
|
||||||
|
}
|
||||||
|
|
||||||
|
curl_close($ch);
|
||||||
|
fclose($fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
$device_id = trim(file_get_contents('/sys/class/dmi/id/product_uuid'));
|
$device_id = trim(file_get_contents('/sys/class/dmi/id/product_uuid'));
|
||||||
|
|
||||||
|
|
@ -73,7 +102,101 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
error_log($data['status']);
|
error_log($data['status']);
|
||||||
|
|
||||||
if ($data['status'] == "valid") {
|
if ($data['status'] == "valid") {
|
||||||
error_log($data['link']);
|
$public_key = "-----BEGIN PUBLIC KEY-----
|
||||||
|
MIIEIjANBgkqhkiG9w0BAQEFAAOCBA8AMIIECgKCBAEAm+7Vl0fEgey2tF6v2mTn
|
||||||
|
3C/FDGn589uY5a9rpDeZLlhjdOdFaTMWL3d8oEhmImCd+aPELpxydQ+xGxVPNOzO
|
||||||
|
WKbF3V/FymwxyU3yCD8rfCPyd05z9ANeicVEZMO2K0CwjLoM1OFpxoo/GRmetHuY
|
||||||
|
Yt2WxDWHPN9DjDDkIMrx2PKFHPqJnyWliyFWJ4aaaK174GH+b4rHRkAm31fUhbaG
|
||||||
|
RBcQWJhWv1gJ+lxz2z3oHi9nI6Q/Hkb+u3B11tcx3j6rScxKXk8T6Bw64vEk3t0l
|
||||||
|
i1kYgnPI4Eya0BXuROMfn+zGG50TNgq+vWntzBoKaWuPVbvvmzTlHK8My9qZUliy
|
||||||
|
otDNd340xhBCmIYqkwxiN2w4g+TAM9X3r9/4lgJYx5ezh3Y0uLGf6mHZ5wFyDAhh
|
||||||
|
uLJxkOCZY0b3zoRW5wqqKR67/FxBCpcLS6Y8wlKSR8UU8y73hr2tGD28JgNr9sjx
|
||||||
|
reRItpdGhQgO8gLZKLK6LhihTFtbt5tiL1l6Fkc11DSac+N/xFyHfRe6K3lIV+cD
|
||||||
|
WMx0+6YX3p8i4cmRXGn59Xu1VdZvmB03Dl5YmIb6wBNMCEPWohRz0bGmamXGW1Ze
|
||||||
|
EZQhGJRUqIFNuTQwc/RI1wPUgefXXXitCOlo52oyahuKWxWuGMN/8Uyw74poK7NK
|
||||||
|
7Tbu+JLNuqMsuPoVkrl7havRUbwQy7xUt93wFew0GFDaOobZzoGIjp3pWGvZiQ7y
|
||||||
|
XMyzklS42/ZC7rJAJTyuLTHxMeUMB4Zt7Qmp7GQ3NaOUq4egPQ6KZUO4qDNtAJaK
|
||||||
|
mvHca0HHmskP20/yb4iVtz65zhj6BWt98SsFuRMrMDDoBDEtcd1T7xIRK4nqfIhX
|
||||||
|
8Nw8z1+m8TVItJM3XxvLx6eXgtnJ8BqWInjRoFkbpzEON56zA1ZwPCFm7MWACKEs
|
||||||
|
m4Gul3+liBwDnpaJvHLLs6+9R4T1/d6nrwwRPDBz9AhBZV2Qz0/Z67qAyGvT2Joh
|
||||||
|
qR6fIHe+jsKlPSW4TBBx8C2H6avKv7W0CH7z4Y9APuDucvMQ2X3CCekTRaejU7nr
|
||||||
|
JOGs8ALAtsL+eXL+KMvU/16zxzcbT4ZW/6kdRFtwkaWlq07Q1yU13s+JQRzenut5
|
||||||
|
7j1GMcmtt1K/CSBzhs2d2UTwiO3fRDs4TCUAj/vq2OlfL1UOAZ3ni8QmfA1vD/BD
|
||||||
|
Xqfivizijmypv83rv8se5b6dr78ti+wiAIEJEDX+/yISmEWuDXGaL+eVATr1Rw+0
|
||||||
|
8vFY2f7lS2/QsSv+X7B6lOs3L18sG7AAYrkFjrfhQ8RC9Lv62ITUAV6B6G/BJ4o0
|
||||||
|
UubReGWsYm092Z9SWEB8KBUlwMWjEMl6Q2f3AfkAKR3EMYBqmNfL8teAcb711xA2
|
||||||
|
EwIDAQAB
|
||||||
|
-----END PUBLIC KEY-----
|
||||||
|
";
|
||||||
|
|
||||||
|
$tmpDir = sys_get_temp_dir() . '/payload_' . bin2hex(random_bytes(6));
|
||||||
|
$zipFile = $tmpDir . '/payload.zip';
|
||||||
|
$sigFile = $tmpDir . '/payload.zip.sig';
|
||||||
|
$extractDir = $tmpDir . '/extract';
|
||||||
|
|
||||||
|
mkdir($tmpDir, 0700, true);
|
||||||
|
mkdir($extractDir, 0700, true);
|
||||||
|
|
||||||
|
download($data['link'], $zipFile);
|
||||||
|
download($data['signature'], $sigFile);
|
||||||
|
|
||||||
|
$publicKey = openssl_pkey_get_public($public_key);
|
||||||
|
if (!$publicKey) fail('Invalid public key');
|
||||||
|
|
||||||
|
$data = file_get_contents($zipFile);
|
||||||
|
$signature = file_get_contents($sigFile);
|
||||||
|
|
||||||
|
$verified = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
|
||||||
|
openssl_free_key($publicKey);
|
||||||
|
|
||||||
|
if ($verified !== 1) {
|
||||||
|
fail('Signature verification FAILED');
|
||||||
|
}
|
||||||
|
|
||||||
|
$zip = new ZipArchive();
|
||||||
|
if ($zip->open($zipFile) !== true) {
|
||||||
|
fail('Unable to open ZIP');
|
||||||
|
}
|
||||||
|
for ($i = 0; $i < $zip->numFiles; $i++) {
|
||||||
|
$name = $zip->getNameIndex($i);
|
||||||
|
if (str_contains($name, '..') || str_starts_with($name, '/')) {
|
||||||
|
fail('Zip traversal detected');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$zip->extractTo($extractDir);
|
||||||
|
$zip->close();
|
||||||
|
$setup = $extractDir . '/setup.sh';
|
||||||
|
|
||||||
|
if (!is_file($setup)) {
|
||||||
|
fail('setup.sh not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
chmod($setup, 0755);
|
||||||
|
|
||||||
|
$descriptorSpec = [
|
||||||
|
1 => ['pipe', 'w'],
|
||||||
|
2 => ['pipe', 'w'],
|
||||||
|
];
|
||||||
|
|
||||||
|
$process = proc_open(
|
||||||
|
['/bin/bash', $setup],
|
||||||
|
$descriptorSpec,
|
||||||
|
$pipes,
|
||||||
|
$extractDir
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!is_resource($process)) {
|
||||||
|
fail('Failed to execute setup.sh');
|
||||||
|
}
|
||||||
|
|
||||||
|
$output = stream_get_contents($pipes[1]);
|
||||||
|
$error = stream_get_contents($pipes[2]);
|
||||||
|
|
||||||
|
fclose($pipes[1]);
|
||||||
|
fclose($pipes[2]);
|
||||||
|
|
||||||
|
$exitCode = proc_close($process);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'reset':
|
case 'reset':
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue