1
0
mirror of https://github.com/speed47/spectre-meltdown-checker synced 2024-12-22 20:33:56 +01:00

feat: use the MCExtractor DB as the reference for the microcode versions

Use platomav's MCExtractor DB as the reference to decide whether our CPU microcode is the latest or not.
We have a builtin version of the DB in the script, but an updated version can be fetched and stored locally with --update-mcedb
This commit is contained in:
Stéphane Lesimple 2018-09-23 17:29:14 +02:00
parent 53d6a44754
commit 90c2ae5de2

View File

@ -21,6 +21,7 @@ exit_cleanup()
[ -n "$dumped_config" ] && [ -f "$dumped_config" ] && rm -f "$dumped_config" [ -n "$dumped_config" ] && [ -f "$dumped_config" ] && rm -f "$dumped_config"
[ -n "$kerneltmp" ] && [ -f "$kerneltmp" ] && rm -f "$kerneltmp" [ -n "$kerneltmp" ] && [ -f "$kerneltmp" ] && rm -f "$kerneltmp"
[ -n "$kerneltmp2" ] && [ -f "$kerneltmp2" ] && rm -f "$kerneltmp2" [ -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_debugfs" = 1 ] && umount /sys/kernel/debug 2>/dev/null
[ "$mounted_procfs" = 1 ] && umount "$procfs" 2>/dev/null [ "$mounted_procfs" = 1 ] && umount "$procfs" 2>/dev/null
[ "$insmod_cpuid" = 1 ] && rmmod cpuid 2>/dev/null [ "$insmod_cpuid" = 1 ] && rmmod cpuid 2>/dev/null
@ -80,6 +81,7 @@ show_usage()
--hw-only only check for CPU information, don't check for any variant --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 --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 --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)
Return codes: Return codes:
0 (not vulnerable), 2 (vulnerable), 3 (unknown), 255 (error) 0 (not vulnerable), 2 (vulnerable), 3 (unknown), 255 (error)
@ -576,6 +578,65 @@ show_header()
_info _info
} }
if [ -n "$HOME" ]; then
mcedb_cache="$HOME/.mcedb"
else
mcedb_cache="$(getent passwd "$(whoami)" | cut -d: -f6)/.mcedb"
fi
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"
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" >> "$mcedb_cache"
echo OK "local version updated"
}
parse_opt_file() parse_opt_file()
{ {
# parse_opt_file option_name option_value # parse_opt_file option_name option_value
@ -654,6 +715,9 @@ while [ -n "$1" ]; do
# deprecated, kept for compatibility # deprecated, kept for compatibility
opt_explain=0 opt_explain=0
shift shift
elif [ "$1" = "--update-mcedb" ]; then
update_mcedb
exit $?
elif [ "$1" = "--explain" ]; then elif [ "$1" = "--explain" ]; then
opt_explain=1 opt_explain=1
shift shift
@ -1329,58 +1393,38 @@ is_zen_cpu()
return 1 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() is_latest_known_ucode()
{ {
# 0: yes, 1: no, 2: unknown # 0: yes, 1: no, 2: unknown
parse_cpu_details parse_cpu_details
ucode_latest="latest microcode version for your CPU model is unknown" ucode_latest="latest microcode version for your CPU model is unknown"
is_intel || return 2 if ! is_intel && ! is_amd; then
# https://www.intel.com/content/dam/www/public/us/en/documents/sa00115-microcode-update-guidance.pdf return 2
# 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 fi
# cpuid,ucode # cpuid,version,date
for tuple in \ for tuple in $(read_mcedb)
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
do do
cpuid_decimal=$(( $(echo "$tuple" | cut -d, -f1) )) cpu_brand=$( echo "$tuple" | cut -d, -f1)
ucode_decimal=$(( $(echo "$tuple" | cut -d, -f2) )) is_intel && [ "$cpu_brand" != I ] && continue
is_amd && [ "$cpu_brand" != A ] && continue
cpuid_decimal=$(( $(echo "$tuple" | cut -d, -f2) ))
ucode_decimal=$(( $(echo "$tuple" | cut -d, -f3) ))
ucode_date=$( echo "$tuple" | cut -d, -f4)
if [ "$cpuid_decimal" = "$cpu_cpuid" ]; then if [ "$cpuid_decimal" = "$cpu_cpuid" ]; then
_debug "is_latest_known_ucode: with cpuid $cpu_cpuid has ucode $cpu_ucode, last known is $cpuid_decimal" _debug "is_latest_known_ucode: with cpuid $cpu_cpuid has ucode $cpu_ucode, last known is $cpuid_decimal from $ucode_date"
ucode_latest=$(printf "latest known version is 0x%x according to Intel Microcode Guidance, August 8 2018" "$ucode_decimal") ucode_latest=$(printf "latest version is 0x%x dated $ucode_date according to $mcedb_info" "$ucode_decimal")
if [ "$cpu_ucode" -ge "$ucode_decimal" ]; then if [ "$cpu_ucode" -ge "$ucode_decimal" ]; then
return 0 return 0
else else
@ -3891,3 +3935,350 @@ fi
[ "$global_critical" = 1 ] && exit 2 # critical [ "$global_critical" = 1 ] && exit 2 # critical
[ "$global_unknown" = 1 ] && exit 3 # unknown [ "$global_unknown" = 1 ] && exit 3 # unknown
exit 0 # ok 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 v83 - 2018/09/21
# 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