diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 6043177..effc756 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -186,7 +186,7 @@ if [ $ret = $READ_CPUID_RET_OK ]; then cap_ssbd='Intel SSBD' elif [ $ret = $READ_CPUID_RET_ERR ] && [ "$g_mode" = live ]; then # CPUID device unavailable (e.g. in a VM): fall back to /proc/cpuinfo - if grep ^flags "$g_procfs/cpuinfo" | grep -qw ssbd; then + if cpuinfo_has_flag ssbd; then cap_ssbd='Intel SSBD (cpuinfo)' ret=$READ_CPUID_RET_OK fi diff --git a/src/libs/330_cpu_misc.sh b/src/libs/330_cpu_misc.sh index 75e0004..12e0710 100644 --- a/src/libs/330_cpu_misc.sh +++ b/src/libs/330_cpu_misc.sh @@ -22,3 +22,9 @@ is_coreos() { command -v coreos-install >/dev/null 2>&1 && command -v toolbox >/dev/null 2>&1 && return 0 return 1 } + +# Check whether /proc/cpuinfo has $1 in the flags line +# Returns: 0 if flag found, 1 otherwise +cpuinfo_has_flag() { + grep -Eq '^flags\b.+\b'"$1"'\b' "$g_procfs/cpuinfo" 2>/dev/null +} diff --git a/src/libs/350_cpu_detect2.sh b/src/libs/350_cpu_detect2.sh index 62e951c..953f273 100644 --- a/src/libs/350_cpu_detect2.sh +++ b/src/libs/350_cpu_detect2.sh @@ -20,8 +20,8 @@ parse_cpu_details() { cap_avx2=0 cap_avx512=0 if [ -e "$g_procfs/cpuinfo" ]; then - if grep -qw avx2 "$g_procfs/cpuinfo" 2>/dev/null; then cap_avx2=1; fi - if grep -qw avx512 "$g_procfs/cpuinfo" 2>/dev/null; then cap_avx512=1; fi + if cpuinfo_has_flag avx2; then cap_avx2=1; fi + if cpuinfo_has_flag avx512; then cap_avx512=1; fi cpu_vendor=$(grep '^vendor_id' "$g_procfs/cpuinfo" | awk '{print $3}' | head -n1) cpu_friendly_name=$(grep '^model name' "$g_procfs/cpuinfo" | cut -d: -f2- | head -n1 | sed -e 's/^ *//') # ARM-style cpuinfo: parse per-core implementer/part/arch/variant/revision lists diff --git a/src/libs/400_hw_check.sh b/src/libs/400_hw_check.sh index 09be331..398219e 100644 --- a/src/libs/400_hw_check.sh +++ b/src/libs/400_hw_check.sh @@ -513,7 +513,7 @@ check_cpu() { fi if [ -z "$cap_ibrs" ] && [ $ret = $READ_CPUID_RET_ERR ] && has_runtime; then # CPUID device unavailable (e.g. in a VM): fall back to /proc/cpuinfo - if grep ^flags "$g_procfs/cpuinfo" | grep -qw ibrs; then + if cpuinfo_has_flag ibrs; then cap_ibrs='IBRS (cpuinfo)' cap_spec_ctrl=1 pstatus green YES "ibrs flag in $g_procfs/cpuinfo" @@ -588,7 +588,7 @@ check_cpu() { if [ $ret = $READ_CPUID_RET_OK ]; then cap_ibpb='IBPB_SUPPORT' pstatus green YES "IBPB_SUPPORT feature bit" - elif [ $ret = $READ_CPUID_RET_ERR ] && has_runtime && grep ^flags "$g_procfs/cpuinfo" | grep -qw ibpb; then + elif [ $ret = $READ_CPUID_RET_ERR ] && has_runtime && cpuinfo_has_flag ibpb; then # CPUID device unavailable (e.g. in a VM): fall back to /proc/cpuinfo cap_ibpb='IBPB (cpuinfo)' pstatus green YES "ibpb flag in $g_procfs/cpuinfo" @@ -661,7 +661,7 @@ check_cpu() { fi if [ -z "$cap_stibp" ] && [ $ret = $READ_CPUID_RET_ERR ] && has_runtime; then # CPUID device unavailable (e.g. in a VM): fall back to /proc/cpuinfo - if grep ^flags "$g_procfs/cpuinfo" | grep -qw stibp; then + if cpuinfo_has_flag stibp; then cap_stibp='STIBP (cpuinfo)' pstatus green YES "stibp flag in $g_procfs/cpuinfo" ret=$READ_CPUID_RET_OK @@ -733,9 +733,9 @@ check_cpu() { if [ -z "$cap_ssbd" ] && [ "$ret24" = $READ_CPUID_RET_ERR ] && [ "$ret25" = $READ_CPUID_RET_ERR ] && has_runtime; then # CPUID device unavailable (e.g. in a VM): fall back to /proc/cpuinfo - if grep ^flags "$g_procfs/cpuinfo" | grep -qw ssbd; then + if cpuinfo_has_flag ssbd; then cap_ssbd='SSBD (cpuinfo)' - elif grep ^flags "$g_procfs/cpuinfo" | grep -qw virt_ssbd; then + elif cpuinfo_has_flag virt_ssbd; then cap_ssbd='SSBD in VIRT_SPEC_CTRL (cpuinfo)' fi fi @@ -795,7 +795,7 @@ check_cpu() { if [ $ret = $READ_CPUID_RET_OK ]; then pstatus green YES "L1D flush feature bit" cap_l1df=1 - elif [ $ret = $READ_CPUID_RET_ERR ] && has_runtime && grep ^flags "$g_procfs/cpuinfo" | grep -qw flush_l1d; then + elif [ $ret = $READ_CPUID_RET_ERR ] && has_runtime && cpuinfo_has_flag flush_l1d; then # CPUID device unavailable (e.g. in a VM): fall back to /proc/cpuinfo pstatus green YES "flush_l1d flag in $g_procfs/cpuinfo" cap_l1df=1 @@ -815,7 +815,7 @@ check_cpu() { if [ $ret = $READ_CPUID_RET_OK ]; then cap_md_clear=1 pstatus green YES "MD_CLEAR feature bit" - elif [ $ret = $READ_CPUID_RET_ERR ] && has_runtime && grep ^flags "$g_procfs/cpuinfo" | grep -qw md_clear; then + elif [ $ret = $READ_CPUID_RET_ERR ] && has_runtime && cpuinfo_has_flag md_clear; then # CPUID device unavailable (e.g. in a VM): fall back to /proc/cpuinfo cap_md_clear=1 pstatus green YES "md_clear flag in $g_procfs/cpuinfo" @@ -885,7 +885,7 @@ check_cpu() { if [ $ret = $READ_CPUID_RET_OK ]; then pstatus green YES cap_arch_capabilities=1 - elif [ $ret = $READ_CPUID_RET_ERR ] && has_runtime && grep ^flags "$g_procfs/cpuinfo" | grep -qw arch_capabilities; then + elif [ $ret = $READ_CPUID_RET_ERR ] && has_runtime && cpuinfo_has_flag arch_capabilities; then # CPUID device unavailable (e.g. in a VM): fall back to /proc/cpuinfo pstatus green YES "arch_capabilities flag in $g_procfs/cpuinfo" cap_arch_capabilities=1 diff --git a/src/vulns-helpers/check_mds.sh b/src/vulns-helpers/check_mds.sh index e6ded22..5bdba1f 100644 --- a/src/vulns-helpers/check_mds.sh +++ b/src/vulns-helpers/check_mds.sh @@ -138,7 +138,7 @@ check_mds_linux() { if is_x86_kernel; then pr_info_nol "* Kernel supports using MD_CLEAR mitigation: " kernel_md_clear_can_tell=1 - if [ "$g_mode" = live ] && grep ^flags "$g_procfs/cpuinfo" | grep -qw md_clear; then + if [ "$g_mode" = live ] && cpuinfo_has_flag md_clear; then kernel_md_clear="md_clear found in $g_procfs/cpuinfo" pstatus green YES "$kernel_md_clear" fi diff --git a/src/vulns/CVE-2017-5715.sh b/src/vulns/CVE-2017-5715.sh index d672bb3..5eb78d0 100644 --- a/src/vulns/CVE-2017-5715.sh +++ b/src/vulns/CVE-2017-5715.sh @@ -306,7 +306,7 @@ check_CVE_2017_5715_linux() { # which in that case means ibrs is supported *and* enabled for kernel & user # as per the ibrs patch series v3 if [ -z "$g_ibrs_supported" ]; then - if grep ^flags "$g_procfs/cpuinfo" | grep -qw spec_ctrl_ibrs; then + if cpuinfo_has_flag spec_ctrl_ibrs; then pr_debug "ibrs: found spec_ctrl_ibrs flag in $g_procfs/cpuinfo" g_ibrs_supported="spec_ctrl_ibrs flag in $g_procfs/cpuinfo" # enabled=2 -> kernel & user diff --git a/src/vulns/CVE-2017-5754.sh b/src/vulns/CVE-2017-5754.sh index c95edf5..9ffb0ab 100644 --- a/src/vulns/CVE-2017-5754.sh +++ b/src/vulns/CVE-2017-5754.sh @@ -11,7 +11,7 @@ pti_performance_check() { local ret pcid invpcid pr_info_nol " * Reduced performance impact of PTI: " - if [ -e "$g_procfs/cpuinfo" ] && grep ^flags "$g_procfs/cpuinfo" | grep -qw pcid; then + if cpuinfo_has_flag pcid; then pcid=1 else read_cpuid 0x1 0x0 "$ECX" 17 1 1 @@ -21,7 +21,7 @@ pti_performance_check() { fi fi - if [ -e "$g_procfs/cpuinfo" ] && grep ^flags "$g_procfs/cpuinfo" | grep -qw invpcid; then + if cpuinfo_has_flag invpcid; then invpcid=1 else read_cpuid 0x7 0x0 "$EBX" 10 1 1 @@ -110,11 +110,11 @@ check_CVE_2017_5754_linux() { dmesg_grep="$dmesg_grep|x86/pti: Unmapping kernel while in userspace" # aarch64 dmesg_grep="$dmesg_grep|CPU features: detected( feature)?: Kernel page table isolation \(KPTI\)" - if grep ^flags "$g_procfs/cpuinfo" | grep -qw pti; then + if cpuinfo_has_flag pti; then # vanilla PTI patch sets the 'pti' flag in cpuinfo pr_debug "kpti_enabled: found 'pti' flag in $g_procfs/cpuinfo" kpti_enabled=1 - elif grep ^flags "$g_procfs/cpuinfo" | grep -qw kaiser; then + elif cpuinfo_has_flag kaiser; then # kernel line 4.9 sets the 'kaiser' flag in cpuinfo pr_debug "kpti_enabled: found 'kaiser' flag in $g_procfs/cpuinfo" kpti_enabled=1 diff --git a/src/vulns/CVE-2018-3646.sh b/src/vulns/CVE-2018-3646.sh index 20f1fef..e3b8aff 100644 --- a/src/vulns/CVE-2018-3646.sh +++ b/src/vulns/CVE-2018-3646.sh @@ -89,7 +89,7 @@ check_CVE_2018_3646_linux() { pr_info "* Mitigation 2" pr_info_nol " * L1D flush is supported by kernel: " - if [ "$g_mode" = live ] && grep -qw flush_l1d "$g_procfs/cpuinfo"; then + if [ "$g_mode" = live ] && cpuinfo_has_flag flush_l1d; then l1d_kernel="found flush_l1d in $g_procfs/cpuinfo" fi if [ -z "$l1d_kernel" ]; then @@ -162,7 +162,7 @@ check_CVE_2018_3646_linux() { pr_info_nol " * Hardware-backed L1D flush supported: " if [ "$g_mode" = live ]; then - if grep -qw flush_l1d "$g_procfs/cpuinfo" || [ -n "$l1d_xen_hardware" ]; then + if cpuinfo_has_flag flush_l1d || [ -n "$l1d_xen_hardware" ]; then pstatus green YES "performance impact of the mitigation will be greatly reduced" else pstatus blue NO "flush will be done in software, this is slower"