mirror of
https://github.com/speed47/spectre-meltdown-checker
synced 2024-12-23 04:43:37 +01:00
Compare commits
No commits in common. "33cf1cde792ccbd13a151861005ac4f1500d680b" and "36f98eff95a74169b83f0a9f13972503640216c9" have entirely different histories.
33cf1cde79
...
36f98eff95
@ -1199,21 +1199,13 @@ check_kernel()
|
|||||||
_mode="$2"
|
_mode="$2"
|
||||||
# checking the return code of readelf -h is not enough, we could get
|
# checking the return code of readelf -h is not enough, we could get
|
||||||
# a damaged ELF file and validate it, check for stderr warnings too
|
# a damaged ELF file and validate it, check for stderr warnings too
|
||||||
|
_readelf_warnings=$("${opt_arch_prefix}readelf" -S "$_file" 2>&1 >/dev/null | tr "\n" "/"); ret=$?
|
||||||
# the warning "readelf: Warning: [16]: Link field (0) should index a symtab section./" can appear on valid kernels, ignore it
|
|
||||||
_readelf_warnings=$("${opt_arch_prefix}readelf" -S "$_file" 2>&1 >/dev/null | grep -v 'should index a symtab section' | tr "\n" "/"); ret=$?
|
|
||||||
_readelf_sections=$("${opt_arch_prefix}readelf" -S "$_file" 2>/dev/null | grep -c -e data -e text -e init)
|
_readelf_sections=$("${opt_arch_prefix}readelf" -S "$_file" 2>/dev/null | grep -c -e data -e text -e init)
|
||||||
_kernel_size=$(stat -c %s "$_file" 2>/dev/null || stat -f %z "$_file" 2>/dev/null || echo 10000)
|
_kernel_size=$(stat -c %s "$_file" 2>/dev/null || stat -f %z "$_file" 2>/dev/null || echo 10000)
|
||||||
_debug "check_kernel: ret=$? size=$_kernel_size sections=$_readelf_sections warnings=$_readelf_warnings"
|
_debug "check_kernel: ret=$? size=$_kernel_size sections=$_readelf_sections warnings=$_readelf_warnings"
|
||||||
if [ "$_mode" = desperate ]; then
|
if [ "$_mode" = desperate ]; then
|
||||||
if "${opt_arch_prefix}strings" "$_file" | grep -Eq '^Linux version '; then
|
if "${opt_arch_prefix}strings" "$_file" | grep -Eq '^Linux version '; then
|
||||||
_debug "check_kernel (desperate): ... matched!"
|
_debug "check_kernel (desperate): ... matched!"
|
||||||
if [ "$_readelf_sections" = 0 ] && grep -qF -e armv6 -e armv7 "$_file"; then
|
|
||||||
_debug "check_kernel (desperate): raw arm binary found, adjusting objdump options"
|
|
||||||
objdump_options="-D -b binary -marm"
|
|
||||||
else
|
|
||||||
objdump_options="-d"
|
|
||||||
fi
|
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
_debug "check_kernel (desperate): ... invalid"
|
_debug "check_kernel (desperate): ... invalid"
|
||||||
@ -1222,7 +1214,6 @@ check_kernel()
|
|||||||
if [ $ret -eq 0 ] && [ -z "$_readelf_warnings" ] && [ "$_readelf_sections" -gt 0 ]; then
|
if [ $ret -eq 0 ] && [ -z "$_readelf_warnings" ] && [ "$_readelf_sections" -gt 0 ]; then
|
||||||
if [ "$_kernel_size" -ge 100000 ]; then
|
if [ "$_kernel_size" -ge 100000 ]; then
|
||||||
_debug "check_kernel: ... file is valid"
|
_debug "check_kernel: ... file is valid"
|
||||||
objdump_options="-d"
|
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
_debug "check_kernel: ... file seems valid but is too small, ignoring"
|
_debug "check_kernel: ... file seems valid but is too small, ignoring"
|
||||||
@ -3183,7 +3174,7 @@ check_CVE_2017_5753_linux()
|
|||||||
pstatus green YES "$ret occurrence(s) found of x86 32 bits array_index_mask_nospec()"
|
pstatus green YES "$ret occurrence(s) found of x86 32 bits array_index_mask_nospec()"
|
||||||
v1_mask_nospec="x86 32 bits array_index_mask_nospec"
|
v1_mask_nospec="x86 32 bits array_index_mask_nospec"
|
||||||
else
|
else
|
||||||
ret=$("${opt_arch_prefix}objdump" $objdump_options "$kernel" | grep -w -e f3af8014 -e e320f014 -B2 | grep -B1 -w sbc | grep -w -c cmp)
|
ret=$("${opt_arch_prefix}objdump" -d "$kernel" | grep -w -e f3af8014 -e e320f014 -B2 | grep -B1 -w sbc | grep -w -c cmp)
|
||||||
if [ "$ret" -gt 0 ]; then
|
if [ "$ret" -gt 0 ]; then
|
||||||
pstatus green YES "$ret occurrence(s) found of arm 32 bits array_index_mask_nospec()"
|
pstatus green YES "$ret occurrence(s) found of arm 32 bits array_index_mask_nospec()"
|
||||||
v1_mask_nospec="arm 32 bits array_index_mask_nospec"
|
v1_mask_nospec="arm 32 bits array_index_mask_nospec"
|
||||||
@ -3232,7 +3223,7 @@ check_CVE_2017_5753_linux()
|
|||||||
elif ! command -v "${opt_arch_prefix}objdump" >/dev/null 2>&1; then
|
elif ! command -v "${opt_arch_prefix}objdump" >/dev/null 2>&1; then
|
||||||
pstatus yellow UNKNOWN "missing '${opt_arch_prefix}objdump' tool, please install it, usually it's in the binutils package"
|
pstatus yellow UNKNOWN "missing '${opt_arch_prefix}objdump' tool, please install it, usually it's in the binutils package"
|
||||||
else
|
else
|
||||||
"${opt_arch_prefix}objdump" $objdump_options "$kernel" | perl -ne 'push @r, $_; /\s(hint|csdb)\s/ && $r[0]=~/\ssub\s+(x\d+)/ && $r[1]=~/\sbic\s+$1,\s+$1,/ && $r[2]=~/\sand\s/ && exit(9); shift @r if @r>3'; ret=$?
|
"${opt_arch_prefix}objdump" -d "$kernel" | perl -ne 'push @r, $_; /\s(hint|csdb)\s/ && $r[0]=~/\ssub\s+(x\d+)/ && $r[1]=~/\sbic\s+$1,\s+$1,/ && $r[2]=~/\sand\s/ && exit(9); shift @r if @r>3'; ret=$?
|
||||||
if [ "$ret" -eq 9 ]; then
|
if [ "$ret" -eq 9 ]; then
|
||||||
pstatus green YES "mask_nospec64 macro is present and used"
|
pstatus green YES "mask_nospec64 macro is present and used"
|
||||||
v1_mask_nospec="arm64 mask_nospec64"
|
v1_mask_nospec="arm64 mask_nospec64"
|
||||||
@ -3241,33 +3232,6 @@ check_CVE_2017_5753_linux()
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
_info_nol "* Kernel has array_index_nospec (arm64): "
|
|
||||||
# in 4.19+ kernels, the mask_nospec64 asm64 macro is replaced by array_index_nospec, defined in nospec.h, and used in invoke_syscall()
|
|
||||||
# ffffff8008090a4c: 2a0203e2 mov w2, w2
|
|
||||||
# ffffff8008090a50: eb0200bf cmp x5, x2
|
|
||||||
# ffffff8008090a54: da1f03e2 ngc x2, xzr
|
|
||||||
# ffffff8008090a58: d503229f hint #0x14
|
|
||||||
# /!\ can also just be "csdb" instead of "hint #0x14" for native objdump
|
|
||||||
#
|
|
||||||
# if we have v1_mask_nospec or redhat_canonical_spectre>0, don't bother disassembling the kernel, the answer is no.
|
|
||||||
if [ -n "$v1_mask_nospec" ] || [ "$redhat_canonical_spectre" -gt 0 ]; then
|
|
||||||
pstatus yellow NO
|
|
||||||
elif [ -n "$kernel_err" ]; then
|
|
||||||
pstatus yellow UNKNOWN "couldn't check ($kernel_err)"
|
|
||||||
elif ! command -v perl >/dev/null 2>&1; then
|
|
||||||
pstatus yellow UNKNOWN "missing 'perl' binary, please install it"
|
|
||||||
elif ! command -v "${opt_arch_prefix}objdump" >/dev/null 2>&1; then
|
|
||||||
pstatus yellow UNKNOWN "missing '${opt_arch_prefix}objdump' tool, please install it, usually it's in the binutils package"
|
|
||||||
else
|
|
||||||
"${opt_arch_prefix}objdump" -d "$kernel" | perl -ne 'push @r, $_; /\s(hint|csdb)\s/ && $r[0]=~/\smov\s+(w\d+),\s+(w\d+)/ && $r[1]=~/\scmp\s+(x\d+),\s+(x\d+)/ && $r[2]=~/\sngc\s+$2,/ && exit(9); shift @r if @r>3'; ret=$?
|
|
||||||
if [ "$ret" -eq 9 ]; then
|
|
||||||
pstatus green YES "array_index_nospec macro is present and used"
|
|
||||||
v1_mask_nospec="arm64 array_index_nospec"
|
|
||||||
else
|
|
||||||
pstatus yellow NO
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$opt_verbose" -ge 2 ] || { [ -z "$v1_mask_nospec" ] && [ "$redhat_canonical_spectre" != 1 ] && [ "$redhat_canonical_spectre" != 2 ]; }; then
|
if [ "$opt_verbose" -ge 2 ] || { [ -z "$v1_mask_nospec" ] && [ "$redhat_canonical_spectre" != 1 ] && [ "$redhat_canonical_spectre" != 2 ]; }; then
|
||||||
# this is a slow heuristic and we don't need it if we already know the kernel is patched
|
# this is a slow heuristic and we don't need it if we already know the kernel is patched
|
||||||
# but still show it in verbose mode
|
# but still show it in verbose mode
|
||||||
@ -3285,7 +3249,7 @@ check_CVE_2017_5753_linux()
|
|||||||
# so let's push the threshold to 70.
|
# so let's push the threshold to 70.
|
||||||
# v0.33+: now only count lfence opcodes after a jump, way less error-prone
|
# v0.33+: now only count lfence opcodes after a jump, way less error-prone
|
||||||
# non patched kernel have between 0 and 20 matches, patched ones have at least 40-45
|
# non patched kernel have between 0 and 20 matches, patched ones have at least 40-45
|
||||||
nb_lfence=$("${opt_arch_prefix}objdump" $objdump_options "$kernel" 2>/dev/null | grep -w -B1 lfence | grep -Ewc 'jmp|jne|je')
|
nb_lfence=$("${opt_arch_prefix}objdump" -d "$kernel" 2>/dev/null | grep -w -B1 lfence | grep -Ewc 'jmp|jne|je')
|
||||||
if [ "$nb_lfence" -lt 30 ]; then
|
if [ "$nb_lfence" -lt 30 ]; then
|
||||||
pstatus yellow NO "only $nb_lfence jump-then-lfence instructions found, should be >= 30 (heuristic)"
|
pstatus yellow NO "only $nb_lfence jump-then-lfence instructions found, should be >= 30 (heuristic)"
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user