fwupd/plugins/pci-mei/fu-mei-common.c
Richard Hughes 0f6d754d5a Detect if the MEI device has known security issues
If it has, fail HSI-1.
2020-06-01 22:49:39 +01:00

149 lines
3.7 KiB
C

/*
* Copyright (C) 2020 Richard Hughes <richard@hughsie.com>
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#include "config.h"
#include "fu-mei-common.h"
const gchar *
fu_mei_common_family_to_string (FuMeiFamily family)
{
if (family == FU_MEI_FAMILY_SPS)
return "SPS";
if (family == FU_MEI_FAMILY_TXE)
return "TXE";
if (family == FU_MEI_FAMILY_ME)
return "ME";
if (family == FU_MEI_FAMILY_CSME)
return "CSME";
return "AMT";
}
static gint
fu_mei_common_cmp_version (FuMeiVersion *vers1, FuMeiVersion *vers2)
{
guint16 vers1buf[] = {
vers1->major,
vers1->minor,
vers1->hotfix,
vers1->buildno,
};
guint16 vers2buf[] = {
vers2->major,
vers2->minor,
vers2->hotfix,
vers2->buildno,
};
for (guint i = 0; i < 4; i++) {
if (vers1buf[i] < vers2buf[i])
return -1;
if (vers1buf[i] > vers2buf[i])
return 1;
}
return 0;
}
FuMeiIssue
fu_mei_common_is_csme_vulnerable (FuMeiVersion *vers)
{
if (vers->major == 11 && vers->minor == 8 && vers->hotfix >= 70)
return FU_MEI_ISSUE_PATCHED;
if (vers->major == 11 && vers->minor == 11 && vers->hotfix >= 70)
return FU_MEI_ISSUE_PATCHED;
if (vers->major == 11 && vers->minor == 22 && vers->hotfix >= 70)
return FU_MEI_ISSUE_PATCHED;
if (vers->major == 12 && vers->minor == 0 && (vers->hotfix == 49 || vers->hotfix >= 56))
return FU_MEI_ISSUE_PATCHED;
if (vers->major == 13 && vers->minor == 0 && vers->hotfix >= 21)
return FU_MEI_ISSUE_PATCHED;
if (vers->major == 14 && vers->minor == 0 && vers->hotfix >= 11)
return FU_MEI_ISSUE_PATCHED;
if (vers->major == 15)
return FU_MEI_ISSUE_NOT_VULNERABLE;
return FU_MEI_ISSUE_VULNERABLE;
}
FuMeiIssue
fu_mei_common_is_txe_vulnerable (FuMeiVersion *vers)
{
if (vers->major == 3 && vers->minor == 1 && vers->hotfix >= 70)
return FU_MEI_ISSUE_PATCHED;
if (vers->major == 4 && vers->minor == 0 && vers->hotfix >= 20)
return FU_MEI_ISSUE_PATCHED;
if (vers->major == 5)
return FU_MEI_ISSUE_NOT_VULNERABLE;
return FU_MEI_ISSUE_VULNERABLE;
}
FuMeiIssue
fu_mei_common_is_sps_vulnerable (FuMeiVersion *vers)
{
if (vers->major == 3 || vers->major > 5)
return FU_MEI_ISSUE_NOT_VULNERABLE;
if (vers->major == 4) {
if (vers->hotfix < 44)
return FU_MEI_ISSUE_VULNERABLE;
if (vers->platform == 0xA) { /* Purley */
FuMeiVersion ver2 = {
.major = 4,
.minor = 1,
.hotfix = 4,
.buildno = 339,
};
if (fu_mei_common_cmp_version (vers, &ver2) < 0)
return FU_MEI_ISSUE_VULNERABLE;
} else if (vers->platform == 0xE) { /* Bakerville */
FuMeiVersion ver2 = {
.major = 4,
.minor = 0,
.hotfix = 4,
.buildno = 112,
};
if (fu_mei_common_cmp_version (vers, &ver2) < 0)
return FU_MEI_ISSUE_VULNERABLE;
} else if (vers->platform == 0xB) { /* Harrisonville */
FuMeiVersion ver2 = {
.major = 4,
.minor = 0,
.hotfix = 4,
.buildno = 193,
};
if (fu_mei_common_cmp_version (vers, &ver2) < 0)
return FU_MEI_ISSUE_VULNERABLE;
} else if (vers->platform == 0x9) { /* Greenlow */
FuMeiVersion ver2 = {
.major = 4,
.minor = 1,
.hotfix = 4,
.buildno = 88,
};
if (vers->minor < 1)
return FU_MEI_ISSUE_NOT_VULNERABLE;
if (fu_mei_common_cmp_version (vers, &ver2) < 0)
return FU_MEI_ISSUE_VULNERABLE;
} else if (vers->platform == 0xD) { /* MonteVista */
FuMeiVersion ver2 = {
.major = 4,
.minor = 8,
.hotfix = 4,
.buildno = 51,
};
if (fu_mei_common_cmp_version (vers, &ver2) < 0)
return FU_MEI_ISSUE_VULNERABLE;
}
return FU_MEI_ISSUE_NOT_VULNERABLE;
}
if (vers->major == 5) {
if (vers->platform == 0x10) { /* Mehlow */
FuMeiVersion ver2 = { 5, 1, 3, 89 };
if (fu_mei_common_cmp_version (vers, &ver2) < 0)
return FU_MEI_ISSUE_VULNERABLE;
}
return FU_MEI_ISSUE_NOT_VULNERABLE;
}
return FU_MEI_ISSUE_PATCHED;
}