Merge pull request #2 from speed47/master

merge
This commit is contained in:
Rob Gill 2018-10-28 07:51:12 +10:00 committed by GitHub
commit 025855326e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 518 additions and 85 deletions

View File

@ -11,7 +11,7 @@
#
# Stephane Lesimple
#
VERSION='0.39+'
VERSION='0.40'
trap 'exit_cleanup' EXIT
trap '_warn "interrupted, cleaning up..."; exit_cleanup; exit 1' INT
@ -21,6 +21,7 @@ exit_cleanup()
[ -n "$dumped_config" ] && [ -f "$dumped_config" ] && rm -f "$dumped_config"
[ -n "$kerneltmp" ] && [ -f "$kerneltmp" ] && rm -f "$kerneltmp"
[ -n "$kerneltmp2" ] && [ -f "$kerneltmp2" ] && rm -f "$kerneltmp2"
[ -n "$mcedb_tmp" ] && [ -f "$mcedb_tmp" ] && rm -f "$mcedb_tmp"
[ "$mounted_debugfs" = 1 ] && umount /sys/kernel/debug 2>/dev/null
[ "$mounted_procfs" = 1 ] && umount "$procfs" 2>/dev/null
[ "$insmod_cpuid" = 1 ] && rmmod cpuid 2>/dev/null
@ -80,6 +81,8 @@ show_usage()
--hw-only only check for CPU information, don't check for any variant
--no-hw skip CPU information and checks, if you're inspecting a kernel not to be run on this host
--vmm [auto,yes,no] override the detection of the presence of an hypervisor (for CVE-2018-3646), default: auto
--update-mcedb update our local copy of the CPU microcodes versions database (from the awesome MCExtractor project)
--update-builtin-mcedb same as --update-mcedb but update builtin DB inside the script itself
Return codes:
0 (not vulnerable), 2 (vulnerable), 3 (unknown), 255 (error)
@ -484,7 +487,7 @@ is_cpu_vulnerable()
[ "$variant3a" = "immune" ] && variant3a=1 || variant3a=0
[ "$variant4" = "immune" ] && variant4=1 || variant4=0
[ "$variantl1tf" = "immune" ] && variantl1tf=1 || variantl1tf=0
[ "$variantl1tf" = "immune" ] && variantl1tf_sgx=1 || variantl1tf_sgx=0
variantl1tf_sgx="$variantl1tf"
# even if we are vulnerable to L1TF, if there's no SGX, we're safe for the original foreshadow
[ "$cpuid_sgx" = 0 ] && variantl1tf_sgx=1
_debug "is_cpu_vulnerable: final results are <$variant1> <$variant2> <$variant3> <$variant3a> <$variant4> <$variantl1tf> <$variantl1tf_sgx>"
@ -576,6 +579,70 @@ show_header()
_info
}
[ -z "$HOME" ] && HOME="$(getent passwd "$(whoami)" | cut -d: -f6)"
mcedb_cache="$HOME/.mcedb"
update_mcedb()
{
# We're using MCE.db from the excellent platomav's MCExtractor project
show_header
if [ -r "$mcedb_cache" ]; then
previous_mcedb_revision=$(awk '/^# %%% MCEDB / { print $4 }' "$mcedb_cache")
fi
# first download the database
mcedb_tmp="$(mktemp /tmp/mcedb-XXXXXX)"
mcedb_url='https://github.com/platomav/MCExtractor/raw/master/MCE.db'
_info_nol "Fetching MCE.db from the MCExtractor project... "
if which wget >/dev/null 2>&1; then
wget -q "$mcedb_url" -O "$mcedb_tmp"; ret=$?
elif which curl >/dev/null 2>&1; then
curl -sL "$mcedb_url" -o "$mcedb_tmp"; ret=$?
elif which fetch >/dev/null 2>&1; then
fetch -q "$mcedb_url" -o "$mcedb_tmp"; ret=$?
else
echo ERROR "please install one of \`wget\`, \`curl\` of \`fetch\` programs"
return 1
fi
if [ "$ret" != 0 ]; then
echo ERROR "error $ret while downloading MCE.db"
return $ret
fi
echo DONE
# now extract contents using sqlite
_info_nol "Extracting data... "
if ! which sqlite3 >/dev/null 2>&1; then
echo ERROR "please install the \`sqlite3\` program"
return 1
fi
mcedb_revision=$(sqlite3 "$mcedb_tmp" "select revision from MCE")
mcedb_date=$(sqlite3 "$mcedb_tmp" "select strftime('%Y/%m/%d', date, 'unixepoch') from MCE")
if [ -z "$mcedb_revision" ]; then
echo ERROR "downloaded file seems invalid"
return 1
fi
echo OK "MCExtractor database revision $mcedb_revision dated $mcedb_date"
if [ -n "$previous_mcedb_revision" ]; then
if [ "$previous_mcedb_revision" = "v$mcedb_revision" ]; then
echo "We already have this version locally, no update needed"
[ "$1" != builtin ] && return 0
fi
fi
echo "# Spectre & Meltdown Checker" > "$mcedb_cache"
echo "# %%% MCEDB v$mcedb_revision - $mcedb_date" >> "$mcedb_cache"
sqlite3 "$mcedb_tmp" "select '# I,0x'||cpuid||',0x'||version||','||max(yyyymmdd) from Intel group by cpuid order by cpuid asc; select '# A,0x'||cpuid||',0x'||version||','||max(yyyymmdd) from AMD group by cpuid order by cpuid asc" | grep -v '^# .,0x00000000,' >> "$mcedb_cache"
echo OK "local version updated"
if [ "$1" = builtin ]; then
newfile=$(mktemp /tmp/smc-XXXXXX)
awk '/^# %%% MCEDB / { exit }; { print }' "$0" > "$newfile"
awk '{ if (NR>1) { print } }' "$mcedb_cache" >> "$newfile"
cat "$newfile" > "$0"
rm -f "$newfile"
fi
}
parse_opt_file()
{
# parse_opt_file option_name option_value
@ -654,6 +721,12 @@ while [ -n "$1" ]; do
# deprecated, kept for compatibility
opt_explain=0
shift
elif [ "$1" = "--update-mcedb" ]; then
update_mcedb
exit $?
elif [ "$1" = "--update-builtin-mcedb" ]; then
update_mcedb builtin
exit $?
elif [ "$1" = "--explain" ]; then
opt_explain=1
shift
@ -787,7 +860,7 @@ pvulnstatus()
case "$opt_batch_format" in
text) _echo 0 "$1: $2 ($3)";;
short) short_output="${short_output}$1 ";;
short) short_output="${short_output}$1 ";;
json)
case "$2" in
UNK) is_vuln="null";;
@ -1008,6 +1081,9 @@ read_cpuid()
if [ -e /dev/cpu/0/cpuid ]; then
# Linux
if [ ! -r /dev/cpu/0/cpuid ]; then
return 2
fi
# on some kernel versions, /dev/cpu/0/cpuid doesn't imply that the cpuid module is loaded, in that case dd returns an error
dd if=/dev/cpu/0/cpuid bs=16 count=1 >/dev/null 2>&1 || load_cpuid
# we need _leaf to be converted to decimal for dd
@ -1019,6 +1095,9 @@ read_cpuid()
_cpuid=$(dd if=/dev/cpu/0/cpuid bs=16 skip=$_ddskip count=$((_odskip + 1)) 2>/dev/null | od -j $((_odskip * 16)) -A n -t u4)
elif [ -e /dev/cpuctl0 ]; then
# BSD
if [ ! -r /dev/cpuctl0 ]; then
return 2
fi
_cpuid=$(cpucontrol -i "$_leaf" /dev/cpuctl0 2>/dev/null | awk '{print $4,$5,$6,$7}')
# cpuid level 0x1: 0x000306d4 0x00100800 0x4dfaebbf 0xbfebfbff
else
@ -1112,6 +1191,8 @@ parse_cpu_details()
# get raw cpuid, it's always useful (referenced in the Intel doc for firmware updates for example)
if read_cpuid 0x1 $EAX 0 0xFFFFFFFF; then
cpu_cpuid="$read_cpuid_value"
else
cpu_cpuid=0
fi
# under BSD, linprocfs often doesn't export ucode information, so fetch it ourselves the good old way
@ -1270,10 +1351,9 @@ is_ucode_blacklisted()
do
model=$(echo $tuple | cut -d, -f1)
stepping=$(( $(echo $tuple | cut -d, -f2) ))
ucode=$(echo $tuple | cut -d, -f3)
echo "$ucode" | grep -q ^0x && ucode_decimal=$(( ucode ))
if [ "$cpu_model" = "$model" ] && [ "$cpu_stepping" = "$stepping" ]; then
if [ "$cpu_ucode" = "$ucode_decimal" ] || [ "$cpu_ucode" = "$ucode" ]; then
ucode=$(( $(echo $tuple | cut -d, -f3) ))
if [ "$cpu_ucode" = "$ucode" ]; then
_debug "is_ucode_blacklisted: we have a match! ($cpu_model/$cpu_stepping/$cpu_ucode)"
return 0
fi
@ -1288,7 +1368,7 @@ is_skylake_cpu()
# is this a skylake cpu?
# return 0 if yes, 1 otherwise
#if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
# boot_cpu_data.x86 == 6) {
# boot_cpu_data.x86 == 6) {
# switch (boot_cpu_data.x86_model) {
# case INTEL_FAM6_SKYLAKE_MOBILE:
# case INTEL_FAM6_SKYLAKE_DESKTOP:
@ -1329,63 +1409,44 @@ is_zen_cpu()
return 1
}
if [ -r "$mcedb_cache" ]; then
mcedb_source="$mcedb_cache"
mcedb_info="local MCExtractor DB "$(grep -E '^# %%% MCEDB ' "$mcedb_source" | cut -c13-)
else
mcedb_source="$0"
mcedb_info="builtin MCExtractor DB "$(grep -E '^# %%% MCEDB ' "$mcedb_source" | cut -c13-)
fi
read_mcedb()
{
awk '{ if (DELIM==1) { print $2 } } /^# %%% MCEDB / { DELIM=1 }' "$mcedb_source"
}
is_latest_known_ucode()
{
# 0: yes, 1: no, 2: unknown
parse_cpu_details
if [ "$cpu_cpuid" = 0 ]; then
ucode_latest="couldn't get your cpuid"
return 2
fi
ucode_latest="latest microcode version for your CPU model is unknown"
is_intel || return 2
# https://www.intel.com/content/dam/www/public/us/en/documents/sa00115-microcode-update-guidance.pdf
# ps2txt sa00115-microcode-update-guidance.ps | grep -Eo '[0-9A-F]+ [0-9A-F]+ [^ ]+ Production 0x[A-F0-9]+ 0x[^ ]+' | awk '{print "0x"$1","$6" \\"}' | uniq
# cpuid,ucode
for tuple in \
0x106A5,0x1D \
0x106E5,0x0A \
0x20652,0x11 \
0x20655,0x7 \
0x206A7,0x2E \
0x206C2,0x1F \
0x206D6,0x61D \
0x206D7,0x714 \
0x206E6,0x0D \
0x206F2,0x3B \
0x306A9,0x20 \
0x306C3,0x25 \
0x306D4,0x2B \
0x306E4,0x42D \
0x306E7,0x714 \
0x306F2,0x3D \
0x306F4,0x12 \
0x40651,0x24 \
0x40661,0x1A \
0x40671,0x1E \
0x406E3,0xC6 \
0x406F1,0xB00002E \
0x50654,0x200004D \
0x50662,0x17 \
0x50663,0x7000013 \
0x50664,0xF000012 \
0x50665,0xE00000A \
0x506C2,0x14 \
0x506E3,0xC6 \
0x506F1,0x24 \
0x706A1,0x28 \
0x806E9,0x8E \
0x806EA,0x96 \
0x906E9,0x8E \
0x906EA,0x96 \
0x906EB,0x8E
if is_intel; then
cpu_brand_prefix=I
elif is_amd; then
cpu_brand_prefix=A
else
return 2
fi
for tuple in $(read_mcedb | grep "$(printf "^$cpu_brand_prefix,0x%08X," "$cpu_cpuid")")
do
cpuid_decimal=$(( $(echo "$tuple" | cut -d, -f1) ))
ucode_decimal=$(( $(echo "$tuple" | cut -d, -f2) ))
if [ "$cpuid_decimal" = "$cpu_cpuid" ]; then
_debug "is_latest_known_ucode: with cpuid $cpu_cpuid has ucode $cpu_ucode, last known is $cpuid_decimal"
ucode_latest=$(printf "latest known version is 0x%x according to Intel Microcode Guidance, August 8 2018" "$ucode_decimal")
if [ "$cpu_ucode" -ge "$ucode_decimal" ]; then
return 0
else
return 1
fi
ucode=$(( $(echo "$tuple" | cut -d, -f3) ))
ucode_date=$(echo "$tuple" | cut -d, -f4 | sed -r 's=(....)(..)(..)=\1/\2/\3=')
_debug "is_latest_known_ucode: with cpuid $cpu_cpuid has ucode $cpu_ucode, last known is $ucode from $ucode_date"
ucode_latest=$(printf "latest version is 0x%x dated $ucode_date according to $mcedb_info" "$ucode")
if [ "$cpu_ucode" -ge "$ucode" ]; then
return 0
else
return 1
fi
done
_debug "is_latest_known_ucode: this cpuid is not referenced ($cpu_cpuid)"
@ -1503,6 +1564,8 @@ if [ "$opt_live" = 1 ]; then
[ -e "/boot/Image" ] && opt_kernel="/boot/Image"
# Arch armv5/armv7:
[ -e "/boot/zImage" ] && opt_kernel="/boot/zImage"
# Arch arm7:
[ -e "/boot/kernel7.img" ] && opt_kernel="/boot/kernel7.img"
# Linux-Libre:
[ -e "/boot/vmlinuz-linux-libre" ] && opt_kernel="/boot/vmlinuz-linux-libre"
# pine64
@ -1591,7 +1654,7 @@ if [ -e "$opt_kernel" ]; then
if ! which "${opt_arch_prefix}readelf" >/dev/null 2>&1; then
_debug "readelf not found"
kernel_err="missing '${opt_arch_prefix}readelf' tool, please install it, usually it's in the 'binutils' package"
elif [ "$opt_sysfs_only" = 1 ]; then
elif [ "$opt_sysfs_only" = 1 ] || [ "$opt_hw_only" = 1 ]; then
kernel_err='kernel image decompression skipped'
else
extract_kernel "$opt_kernel"
@ -1881,6 +1944,8 @@ check_cpu()
_info_nol " * PRED_CMD MSR is available: "
if [ ! -e /dev/cpu/0/msr ] && [ ! -e /dev/cpuctl0 ]; then
pstatus yellow UNKNOWN "is msr kernel module available?"
elif [ ! -r /dev/cpu/0/msr ] && [ ! -w /dev/cpuctl0 ]; then
pstatus yellow UNKNOWN "are you root?"
else
# the new MSR 'PRED_CTRL' is at offset 0x49, write-only
# we test if of all cpus
@ -1988,8 +2053,8 @@ check_cpu()
if is_intel; then
_info " * Speculative Store Bypass Disable (SSBD)"
_info_nol " * CPU indicates SSBD capability: "
read_cpuid 0x7 $EDX 31 1 1; ret=$?
if [ $ret -eq 0 ]; then
read_cpuid 0x7 $EDX 31 1 1; ret24=$?; ret25=$ret24
if [ $ret24 -eq 0 ]; then
cpuid_ssbd='Intel SSBD'
fi
elif is_amd; then
@ -2028,6 +2093,8 @@ check_cpu()
_info_nol " * FLUSH_CMD MSR is available: "
if [ ! -e /dev/cpu/0/msr ] && [ ! -e /dev/cpuctl0 ]; then
pstatus yellow UNKNOWN "is msr kernel module available?"
elif [ ! -r /dev/cpu/0/msr ] && [ ! -w /dev/cpuctl0 ]; then
pstatus yellow UNKNOWN "are you root?"
else
# the new MSR 'FLUSH_CMD' is at offset 0x10b, write-only
# we test if of all cpus
@ -2090,15 +2157,17 @@ check_cpu()
_info_nol " * ARCH_CAPABILITIES MSR advertises IBRS_ALL capability: "
capabilities_rdcl_no=-1
capabilities_ibrs_all=-1
capabilities_ssb_no=-1
capabilities_rsba=-1
capabilities_l1dflush_no=-1
capabilities_ssb_no=-1
if [ "$cpuid_arch_capabilities" = -1 ]; then
pstatus yellow UNKNOWN
elif [ "$cpuid_arch_capabilities" != 1 ]; then
capabilities_rdcl_no=0
capabilities_ibrs_all=0
capabilities_ssb_no=0
capabilities_rsba=0
capabilities_l1dflush_no=0
capabilities_ssb_no=0
pstatus yellow NO
elif [ ! -e /dev/cpu/0/msr ] && [ ! -e /dev/cpuctl0 ]; then
spec_ctrl_msr=-1
@ -2127,15 +2196,17 @@ check_cpu()
capabilities=$val_cap_msr
capabilities_rdcl_no=0
capabilities_ibrs_all=0
capabilities_ssb_no=0
capabilities_rsba=0
capabilities_l1dflush_no=0
capabilities_ssb_no=0
if [ $val -eq 0 ]; then
_debug "capabilities MSR is $capabilities (decimal)"
[ $(( capabilities >> 0 & 1 )) -eq 1 ] && capabilities_rdcl_no=1
[ $(( capabilities >> 1 & 1 )) -eq 1 ] && capabilities_ibrs_all=1
[ $(( capabilities >> 2 & 1 )) -eq 1 ] && capabilities_rsba=1
[ $(( capabilities >> 3 & 1 )) -eq 1 ] && capabilities_l1dflush_no=1
[ $(( capabilities >> 4 & 1 )) -eq 1 ] && capabilities_ssb_no=1
_debug "capabilities says rdcl_no=$capabilities_rdcl_no ibrs_all=$capabilities_ibrs_all ssb_no=$capabilities_ssb_no rsba=$capabilities_rsba"
_debug "capabilities says rdcl_no=$capabilities_rdcl_no ibrs_all=$capabilities_ibrs_all rsba=$capabilities_rsba l1dflush_no=$capabilities_l1dflush_no ssb_no=$capabilities_ssb_no"
if [ "$capabilities_ibrs_all" = 1 ]; then
if [ $cpu_mismatch -eq 0 ]; then
pstatus green YES
@ -2162,24 +2233,33 @@ check_cpu()
else
pstatus yellow NO
fi
fi
_info_nol " * CPU explicitly indicates not being vulnerable to Variant 4 (SSB_NO): "
if [ "$capabilities_ssb_no" = -1 ]; then
pstatus yellow UNKNOWN
elif [ "$capabilities_ssb_no" = 1 ] || [ "$amd_ssb_no" = 1 ]; then
pstatus green YES
else
pstatus yellow NO
fi
_info_nol " * CPU explicitly indicates not being vulnerable to Variant 4 (SSB_NO): "
if [ "$capabilities_ssb_no" = -1 ]; then
pstatus yellow UNKNOWN
elif [ "$capabilities_ssb_no" = 1 ] || [ "$amd_ssb_no" = 1 ]; then
pstatus green YES
else
pstatus yellow NO
fi
_info_nol " * Hypervisor indicates host CPU might be vulnerable to RSB underflow (RSBA): "
if [ "$capabilities_rsba" = -1 ]; then
pstatus yellow UNKNOWN
elif [ "$capabilities_rsba" = 1 ]; then
pstatus yellow YES
else
pstatus blue NO
_info_nol " * CPU/Hypervisor indicates L1D flushing is not necessary on this system: "
if [ "$capabilities_l1dflush_no" = -1 ]; then
pstatus yellow UNKNOWN
elif [ "$capabilities_l1dflush_no" = 1 ]; then
pstatus green YES
else
pstatus yellow NO
fi
_info_nol " * Hypervisor indicates host CPU might be vulnerable to RSB underflow (RSBA): "
if [ "$capabilities_rsba" = -1 ]; then
pstatus yellow UNKNOWN
elif [ "$capabilities_rsba" = 1 ]; then
pstatus yellow YES
else
pstatus blue NO
fi
fi
_info_nol " * CPU supports Software Guard Extensions (SGX): "
@ -3157,6 +3237,8 @@ check_CVE_2017_5754_linux()
dmesg_grep="Kernel/User page tables isolation: enabled"
dmesg_grep="$dmesg_grep|Kernel page table isolation enabled"
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 "$procfs/cpuinfo" | grep -qw pti; then
# vanilla PTI patch sets the 'pti' flag in cpuinfo
_debug "kpti_enabled: found 'pti' flag in $procfs/cpuinfo"
@ -3255,7 +3337,7 @@ check_CVE_2017_5754_linux()
if [ -n "$kpti_support" ]; then
if [ -e "/sys/kernel/debug/x86/pti_enabled" ]; then
explain "Your kernel supports PTI but it's disabled, you can enable it with \`echo 1 > /sys/kernel/debug/x86/pti_enabled\`"
elif grep -q -w nopti -w pti=off "$procfs/cmdline"; then
elif grep -q -w -e nopti -e pti=off "$procfs/cmdline"; then
explain "Your kernel supports PTI but it has been disabled on command-line, remove the nopti or pti=off option from your bootloader configuration"
else
explain "Your kernel supports PTI but it has been disabled, check \`dmesg\` right after boot to find clues why the system disabled it"
@ -3722,13 +3804,17 @@ check_CVE_2018_3646_linux()
_info_nol " * L1D flush enabled: "
if [ "$opt_live" = 1 ]; then
if [ -r "/sys/devices/system/cpu/vulnerabilities/l1tf" ]; then
if grep -Eq 'VMX: (L1D )?vulnerable' "/sys/devices/system/cpu/vulnerabilities/l1tf"; then
# vanilla: VMX: $l1dstatus, SMT $smtstatus
# Red Hat: VMX: SMT $smtstatus, L1D $l1dstatus
# $l1dstatus is one of (auto|vulnerable|conditional cache flushes|cache flushes|EPT disabled|flush not necessary)
# $smtstatus is one of (vulnerable|disabled)
if grep -Eq '(VMX:|L1D) (EPT disabled|vulnerable|flush not necessary)' "/sys/devices/system/cpu/vulnerabilities/l1tf"; then
l1d_mode=0
pstatus yellow NO
elif grep -Eq 'VMX: (L1D )?conditional cache flushes' "/sys/devices/system/cpu/vulnerabilities/l1tf"; then
elif grep -Eq '(VMX:|L1D) conditional cache flushes' "/sys/devices/system/cpu/vulnerabilities/l1tf"; then
l1d_mode=1
pstatus green YES "conditional flushes"
elif grep -Eq 'VMX: (L1D )?cache flushes' "/sys/devices/system/cpu/vulnerabilities/l1tf"; then
elif grep -Eq '(VMX:|L1D) cache flushes' "/sys/devices/system/cpu/vulnerabilities/l1tf"; then
l1d_mode=2
pstatus green YES "unconditional flushes"
else
@ -3889,3 +3975,350 @@ fi
[ "$global_critical" = 1 ] && exit 2 # critical
[ "$global_unknown" = 1 ] && exit 3 # unknown
exit 0 # ok
# We're using MCE.db from the excellent platomav's MCExtractor project
# The builtin version follows, the user can update it with --update-mcedb
# wget https://github.com/platomav/MCExtractor/raw/master/MCE.db
# sqlite3 MCE.db "select '%%% MCEDB v'||revision||' - '||strftime('%Y/%m/%d', date, 'unixepoch') from MCE; select '# I,0x'||cpuid||',0x'||version||','||max(yyyymmdd) from Intel group by cpuid order by cpuid asc; select '# A,0x'||cpuid||',0x'||version||','||max(yyyymmdd) from AMD group by cpuid order by cpuid asc"
# %%% MCEDB v84 - 2018/09/27
# I,0x00000611,0x00000B27,19961218
# I,0x00000612,0x000000C6,19961210
# I,0x00000616,0x000000C6,19961210
# I,0x00000617,0x000000C6,19961210
# I,0x00000619,0x000000D2,19980218
# I,0x00000630,0x00000013,19960827
# I,0x00000632,0x00000020,19960903
# I,0x00000633,0x00000036,19980923
# I,0x00000634,0x00000037,19980923
# I,0x00000650,0x00000040,19990525
# I,0x00000651,0x00000040,19990525
# I,0x00000652,0x0000002D,19990518
# I,0x00000653,0x00000010,19990628
# I,0x00000660,0x0000000A,19990505
# I,0x00000665,0x00000003,19990505
# I,0x0000066A,0x0000000C,19990505
# I,0x0000066D,0x00000007,19990505
# I,0x00000670,0x00000007,19980602
# I,0x00000671,0x00000003,19980811
# I,0x00000672,0x00000010,19990922
# I,0x00000673,0x0000000E,19990910
# I,0x00000680,0x00000014,19990610
# I,0x00000681,0x00000014,19991209
# I,0x00000683,0x00000013,20010206
# I,0x00000686,0x00000007,20000505
# I,0x0000068A,0x00000004,20001207
# I,0x00000690,0x00000004,20000206
# I,0x00000691,0x00000001,20020527
# I,0x00000692,0x00000001,20020620
# I,0x00000694,0x00000002,20020926
# I,0x00000695,0x00000007,20041109
# I,0x00000696,0x00000001,20000707
# I,0x000006A0,0x00000003,20000110
# I,0x000006A1,0x00000001,20000306
# I,0x000006A4,0x00000001,20000616
# I,0x000006B0,0x0000001A,20010129
# I,0x000006B1,0x0000001D,20010220
# I,0x000006B4,0x00000002,20020111
# I,0x000006D0,0x00000006,20030522
# I,0x000006D1,0x00000009,20030709
# I,0x000006D2,0x00000010,20030814
# I,0x000006D6,0x00000018,20041017
# I,0x000006D8,0x00000021,20060831
# I,0x000006E0,0x00000008,20050215
# I,0x000006E1,0x0000000C,20050413
# I,0x000006E4,0x00000026,20050816
# I,0x000006E8,0x0000003C,20060208
# I,0x000006EC,0x0000005B,20070208
# I,0x000006F0,0x00000005,20050818
# I,0x000006F1,0x00000012,20051129
# I,0x000006F2,0x0000005D,20101002
# I,0x000006F4,0x00000028,20060417
# I,0x000006F5,0x00000039,20060727
# I,0x000006F6,0x000000D2,20101001
# I,0x000006F7,0x0000006A,20101002
# I,0x000006F9,0x00000084,20061012
# I,0x000006FA,0x00000095,20101002
# I,0x000006FB,0x000000C1,20111004
# I,0x000006FD,0x000000A4,20101002
# I,0x00000F00,0xFFFF0001,20000130
# I,0x00000F01,0xFFFF0007,20000404
# I,0x00000F02,0xFFFF000B,20000518
# I,0x00000F03,0xFFFF0001,20000518
# I,0x00000F04,0xFFFF0010,20000803
# I,0x00000F05,0x0000000B,20000824
# I,0x00000F06,0x00000004,20000911
# I,0x00000F07,0x00000012,20020716
# I,0x00000F08,0x00000008,20001101
# I,0x00000F09,0x00000008,20010104
# I,0x00000F0A,0x00000015,20020821
# I,0x00000F11,0x0000000A,20030729
# I,0x00000F12,0x0000002D,20030502
# I,0x00000F13,0x00000005,20030508
# I,0x00000F20,0x00000001,20010423
# I,0x00000F21,0x00000002,20010529
# I,0x00000F22,0x00000005,20030729
# I,0x00000F23,0x0000000D,20010817
# I,0x00000F24,0x00000021,20030610
# I,0x00000F25,0x0000002C,20040826
# I,0x00000F26,0x00000010,20040805
# I,0x00000F27,0x00000038,20030604
# I,0x00000F29,0x0000002D,20040811
# I,0x00000F30,0x00000013,20030815
# I,0x00000F31,0x0000000B,20031021
# I,0x00000F32,0x0000000A,20040511
# I,0x00000F33,0x0000000C,20050421
# I,0x00000F34,0x00000017,20050421
# I,0x00000F36,0x00000007,20040309
# I,0x00000F37,0x00000003,20031218
# I,0x00000F40,0x00000006,20040318
# I,0x00000F41,0x00000017,20050422
# I,0x00000F42,0x00000003,20050421
# I,0x00000F43,0x00000005,20050421
# I,0x00000F44,0x00000006,20050421
# I,0x00000F46,0x00000004,20050411
# I,0x00000F47,0x00000003,20050421
# I,0x00000F48,0x0000000E,20080115
# I,0x00000F49,0x00000003,20050421
# I,0x00000F4A,0x00000004,20051214
# I,0x00000F60,0x00000005,20050124
# I,0x00000F61,0x00000008,20050610
# I,0x00000F62,0x0000000F,20051215
# I,0x00000F63,0x00000005,20051010
# I,0x00000F64,0x00000004,20051223
# I,0x00000F65,0x0000000B,20070510
# I,0x00000F66,0x0000001B,20060310
# I,0x00000F68,0x00000009,20060714
# I,0x00001632,0x00000002,19980610
# I,0x00010650,0x00000002,20060513
# I,0x00010660,0x00000004,20060612
# I,0x00010661,0x00000043,20101004
# I,0x00010670,0x00000005,20070209
# I,0x00010671,0x00000106,20070329
# I,0x00010674,0x84050100,20070726
# I,0x00010676,0x00000612,20150802
# I,0x00010677,0x0000070D,20150802
# I,0x0001067A,0x00000A0E,20150729
# I,0x000106A0,0xFFFF001A,20071128
# I,0x000106A1,0xFFFF000B,20080220
# I,0x000106A2,0xFFFF0019,20080714
# I,0x000106A4,0x00000013,20150630
# I,0x000106A5,0x0000001D,20180511
# I,0x000106C0,0x00000007,20070824
# I,0x000106C1,0x00000109,20071203
# I,0x000106C2,0x00000217,20090410
# I,0x000106C9,0x00000007,20090213
# I,0x000106CA,0x00000107,20090825
# I,0x000106D0,0x00000005,20071204
# I,0x000106D1,0x0000002A,20150803
# I,0x000106E0,0xFFFF0022,20090116
# I,0x000106E1,0xFFFF000D,20090206
# I,0x000106E3,0xFFFF0011,20090512
# I,0x000106E4,0x00000003,20130701
# I,0x000106E5,0x0000000A,20180508
# I,0x000106F0,0xFFFF0009,20090210
# I,0x000106F1,0xFFFF0007,20090210
# I,0x00020650,0xFFFF0008,20090218
# I,0x00020651,0xFFFF0018,20090818
# I,0x00020652,0x00000011,20180508
# I,0x00020654,0xFFFF0007,20091124
# I,0x00020655,0x00000007,20180423
# I,0x00020661,0x00000105,20110718
# I,0x000206A0,0x00000029,20091102
# I,0x000206A1,0x00000007,20091223
# I,0x000206A2,0x00000027,20100502
# I,0x000206A3,0x00000009,20100609
# I,0x000206A4,0x00000022,20100414
# I,0x000206A5,0x00000007,20100722
# I,0x000206A6,0x90030028,20100924
# I,0x000206A7,0x0000002E,20180410
# I,0x000206C0,0xFFFF001C,20091214
# I,0x000206C1,0x00000006,20091222
# I,0x000206C2,0x0000001F,20180508
# I,0x000206D0,0x80000006,20100816
# I,0x000206D1,0x80000106,20101201
# I,0x000206D2,0x9584020C,20110622
# I,0x000206D3,0x80000304,20110420
# I,0x000206D5,0x00000513,20111013
# I,0x000206D6,0x0000061D,20180508
# I,0x000206D7,0x00000714,20180508
# I,0x000206E0,0xE3493401,20090108
# I,0x000206E1,0xE3493402,20090224
# I,0x000206E2,0xFFFF0004,20081001
# I,0x000206E3,0xE4486547,20090701
# I,0x000206E4,0xFFFF0008,20090619
# I,0x000206E5,0xFFFF0018,20091215
# I,0x000206E6,0x0000000D,20180515
# I,0x000206F0,0x00000004,20100630
# I,0x000206F1,0x00000008,20101013
# I,0x000206F2,0x0000003B,20180516
# I,0x00030650,0x00000009,20120118
# I,0x00030651,0x00000110,20131014
# I,0x00030660,0x00000003,20101103
# I,0x00030661,0x0000010F,20150721
# I,0x00030669,0x0000010D,20130515
# I,0x00030671,0x00000117,20130410
# I,0x00030672,0x0000022E,20140401
# I,0x00030673,0x00000326,20180110
# I,0x00030678,0x00000837,20180125
# I,0x00030679,0x0000090A,20180110
# I,0x000306A0,0x00000007,20110407
# I,0x000306A2,0x0000000C,20110725
# I,0x000306A4,0x00000007,20110908
# I,0x000306A5,0x00000009,20111110
# I,0x000306A6,0x00000004,20111114
# I,0x000306A8,0x00000010,20120220
# I,0x000306A9,0x00000020,20180410
# I,0x000306C0,0xFFFF0013,20111110
# I,0x000306C1,0xFFFF0014,20120725
# I,0x000306C2,0xFFFF0006,20121017
# I,0x000306C3,0x00000025,20180402
# I,0x000306D1,0xFFFF0009,20131015
# I,0x000306D2,0xFFFF0009,20131219
# I,0x000306D3,0xE3121338,20140825
# I,0x000306D4,0x0000002B,20180322
# I,0x000306E0,0x00000008,20120726
# I,0x000306E2,0x0000020D,20130321
# I,0x000306E3,0x00000308,20130321
# I,0x000306E4,0x0000042D,20180425
# I,0x000306E6,0x00000600,20130619
# I,0x000306E7,0x00000714,20180425
# I,0x000306F0,0xFFFF0017,20130730
# I,0x000306F1,0x00000014,20140110
# I,0x000306F2,0x0000003D,20180420
# I,0x000306F3,0x0000000D,20160211
# I,0x000306F4,0x00000012,20180420
# I,0x00040650,0xFFFF000B,20121206
# I,0x00040651,0x00000024,20180402
# I,0x00040660,0xFFFF0011,20121012
# I,0x00040661,0x0000001A,20180402
# I,0x00040670,0xFFFF0006,20140304
# I,0x00040671,0x0000001E,20180403
# I,0x000406A0,0x80124001,20130521
# I,0x000406A8,0x0000081F,20140812
# I,0x000406A9,0x0000081F,20140812
# I,0x000406C1,0x0000010B,20140814
# I,0x000406C2,0x00000221,20150218
# I,0x000406C3,0x00000367,20171225
# I,0x000406C4,0x00000410,20180104
# I,0x000406D0,0x0000000E,20130612
# I,0x000406D8,0x0000012A,20180104
# I,0x000406E1,0x00000020,20141111
# I,0x000406E2,0x0000002C,20150521
# I,0x000406E3,0x000000C6,20180417
# I,0x000406E8,0x00000026,20160414
# I,0x000406F0,0x00000014,20150702
# I,0x000406F1,0x0B00002E,20180419
# I,0x00050650,0x8000002B,20160208
# I,0x00050651,0x8000002B,20160208
# I,0x00050652,0x80000037,20170502
# I,0x00050653,0x01000144,20180420
# I,0x00050654,0x0200004D,20180515
# I,0x00050655,0x0300000B,20180427
# I,0x00050661,0xF1000008,20150130
# I,0x00050662,0x00000017,20180525
# I,0x00050663,0x07000013,20180420
# I,0x00050664,0x0F000012,20180420
# I,0x00050665,0x0E00000A,20180420
# I,0x00050670,0xFFFF0030,20151113
# I,0x00050671,0x000001B6,20180108
# I,0x000506A0,0x00000038,20150112
# I,0x000506C2,0x00000014,20180511
# I,0x000506C8,0x90011010,20160323
# I,0x000506C9,0x00000032,20180511
# I,0x000506CA,0x0000000C,20180511
# I,0x000506D1,0x00000102,20150605
# I,0x000506E0,0x00000018,20141119
# I,0x000506E1,0x0000002A,20150602
# I,0x000506E2,0x0000002E,20150815
# I,0x000506E3,0x000000C6,20180417
# I,0x000506E8,0x00000034,20160710
# I,0x000506F1,0x00000024,20180511
# I,0x00060660,0x0000000C,20160821
# I,0x00060661,0x0000000E,20170128
# I,0x00060662,0x00000022,20171129
# I,0x00060663,0x0000002A,20180417
# I,0x000706A0,0x00000026,20170712
# I,0x000706A1,0x0000002A,20180725
# I,0x00080650,0x00000018,20180108
# I,0x000806E9,0x00000098,20180626
# I,0x000806EA,0x00000096,20180515
# I,0x000806EB,0x00000098,20180530
# I,0x000906E9,0x0000008E,20180324
# I,0x000906EA,0x00000096,20180502
# I,0x000906EB,0x0000008E,20180324
# I,0x000906EC,0x0000009E,20180826
# A,0x00000F00,0x02000008,20070614
# A,0x00000F01,0x0000001C,20021031
# A,0x00000F10,0x00000003,20020325
# A,0x00000F11,0x0000001F,20030220
# A,0x00000F48,0x00000046,20040719
# A,0x00000F4A,0x00000047,20040719
# A,0x00000F50,0x00000024,20021212
# A,0x00000F51,0x00000025,20030115
# A,0x00010F50,0x00000041,20040225
# A,0x00020F10,0x0000004D,20050428
# A,0x00040F01,0xC0012102,20050916
# A,0x00040F0A,0x00000068,20060920
# A,0x00040F13,0x0000007A,20080508
# A,0x00040F14,0x00000062,20060127
# A,0x00040F1B,0x0000006D,20060920
# A,0x00040F33,0x0000007B,20080514
# A,0x00060F80,0x00000083,20060929
# A,0x000C0F1B,0x0000006E,20060921
# A,0x000F0F00,0x00000005,20020627
# A,0x000F0F01,0x00000015,20020627
# A,0x00100F00,0x01000020,20070326
# A,0x00100F20,0x010000CA,20100331
# A,0x00100F22,0x010000C9,20100331
# A,0x00100F40,0x01000085,20080501
# A,0x00100F41,0x010000DB,20111024
# A,0x00100F42,0x01000092,20081021
# A,0x00100F43,0x010000C8,20100311
# A,0x00100F62,0x010000C7,20100311
# A,0x00100F80,0x010000DA,20111024
# A,0x00100F81,0x010000D9,20111012
# A,0x00100FA0,0x010000DC,20111024
# A,0x00120F00,0x03000002,20100324
# A,0x00200F30,0x02000018,20070921
# A,0x00200F31,0x02000057,20080502
# A,0x00200F32,0x02000034,20080307
# A,0x00300F01,0x0300000E,20101004
# A,0x00300F10,0x03000027,20111309
# A,0x00500F00,0x0500000B,20100601
# A,0x00500F01,0x0500001A,20100908
# A,0x00500F10,0x05000029,20130121
# A,0x00500F20,0x05000119,20130118
# A,0x00580F00,0x0500000B,20100601
# A,0x00580F01,0x0500001A,20100908
# A,0x00580F10,0x05000028,20101124
# A,0x00580F20,0x05000101,20110406
# A,0x00600F00,0x06000017,20101029
# A,0x00600F01,0x0600011F,20110227
# A,0x00600F10,0x06000425,20110408
# A,0x00600F11,0x0600050D,20110627
# A,0x00600F12,0x0600063E,20180207
# A,0x00600F20,0x06000852,20180206
# A,0x00610F00,0x0600100E,20111102
# A,0x00610F01,0x0600111F,20180305
# A,0x00630F00,0x0600301C,20130817
# A,0x00630F01,0x06003109,20180227
# A,0x00660F00,0x06006012,20141014
# A,0x00660F01,0x0600611A,20180126
# A,0x00670F00,0x06006705,20180220
# A,0x00680F00,0x06000017,20101029
# A,0x00680F01,0x0600011F,20110227
# A,0x00680F10,0x06000410,20110314
# A,0x00700F00,0x0700002A,20121218
# A,0x00700F01,0x07000110,20180209
# A,0x00730F00,0x07030009,20131206
# A,0x00730F01,0x07030106,20180209
# A,0x00800F00,0x0800002A,20161006
# A,0x00800F10,0x0800100C,20170131
# A,0x00800F11,0x08001137,20180214
# A,0x00800F12,0x08001227,20180209
# A,0x00800F82,0x0800820B,20180620
# A,0x00810F00,0x08100004,20161120
# A,0x00810F10,0x0810100B,20180212
# A,0x00810F80,0x08108002,20180605
# A,0x00820F00,0x08200002,20180214