Friday, July 1, 2016

A year of Windows kernel font fuzzing #2: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 techniques

Posted by Mateusz Jurczyk of Google Project Zero

In part #1 of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 series (see here), we discussed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 motivation and outcomes of our year long fuzzing effort against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows kernel font engine, followed by an analysis of two bug collisions with Keen Team and Hacking Team that ensued as a result of this work. While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bugs cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves are surely amusing, what we find even more interesting are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 techniques and decisions we made to make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 project as effective as it turned out to be. Although several methods we used were very specific to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 particular target, we believe that most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ideas are still applicable to a majority of fuzzing efforts, as we have developed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m through years of experience not only limited to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows kernel. Enjoy!

Technical details

While fuzzing is in principle based on a very simple concept (mutate input, run target, catch crashes, repeat), it's also cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kind of "easy to learn, hard to master" activity. It is composed of a number of different stages, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 final result is a product of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 effectiveness of each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. Thus, in this blog post, we would like to explain how we tried to optimize each part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process based on our experience with fuzzing ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r software in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past.

Preparing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input corpus

When cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 term "fuzzing" is used in relation to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 testing of native applications processing input files, it's typically in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context of mutational fuzzing. This means that an initial corpus of diverse and usually valid input files is prepared beforehand, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n particular samples are slightly mutated during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzing process. This is to retain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 general file structure expected by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tested program, but also to insert random changes not expected by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developers. Historically, this approach has proven to be very effective, as it allowed a large number of different program states to be reached at a low cost without having to generate all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 required (often complex) structures from scratch. Even in coverage-guided fuzzing with an evolving corpus, it is still beneficial to use a high-quality initial data set, as it may save a ton of wall-clock and CPU time which ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise would be wasted on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 brute-force generation of basic constructs in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inputs.

Also in this case, mutational fuzzing was fundamental and has contributed to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 discovery of most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reported bugs. For reasons discussed later on, we decided not to use coverage guidance, which increased cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 importance of a good input corpus even more. Specifically, we were interested in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following file types:

  • TrueType fonts (.TTF extension, handled by win32k.sys),
  • OpenType fonts (.OTF extension, handled by ATMFD.DLL),
  • Bitmap fonts (.FON, .FNT extensions, handled by win32k.sys),
  • Type 1 fonts (.PFB, .PFM, .MMM extensions, handled by ATMFD.DLL).

However, we decided to eventually leave Type 1 out for several reasons:

  • Windows requires at least two corresponding files (.PFB and .PFM) to load a single Type 1 font.
  • The format is structurally very simple, with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most complex part being CharStrings, which were already thoroughly audited by ourselves.
  • Most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font handling logic is shared in ATMFD.DLL between both Type 1 and OpenType formats.

When it comes to Bitmap fonts, we did initially include cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzing, but soon discovered that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only crash being (constantly) hit was an unhandled divide-by-zero exception. Therefore, we decided to exclude it from future fuzzing, and instead focus on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrueType and OpenType formats, which were most interesting anyway.

Since we didn't intend to perform Windows kernel code coverage measurements, we couldn't run cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 typical corpus distillation of a large number of fonts generated automatically by various tools or crawled off cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 web. However, thanks to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous FreeType2 fuzzing, we had several corpora generated for that project. We picked cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one with high coverage redundancy (up to 100 samples per a single basic block pair) and extracted just cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TTF and OTF fonts, which resulted in a collection of 19507 files – 14848 TrueType and 4659 OpenType ones – consuming about 2.4G of disk space.

Using a corpus tailored for one piece of software for fuzzing anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r involves a risk that some features present in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter are not covered by samples for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 former, and with no coverage guidance, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y could never be discovered on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own. In this case I accepted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trade-off, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 risk was partially mitigated by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 redundancy in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corpus, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that FreeType has probably cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most comprehensive support for both TrueType and OpenType formats, which should cover most or all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows font engine features. Lastly, using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 readily available corpus saved us a lot of time, by enabling us to start cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzer as soon as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rest of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 infrastructure was functional.

Mutating TTF & OTF

In our experience, an optimal choice of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mutation strategy is one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most crucial parts of effective fuzzing, so it's usually worth spending some time adjusting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 configuration, or even writing format-specific processing. Conveniently, both TrueType and OpenType formats share a common chunk structure called SFNT. In short, it's a file layout consisting of multiple tables identified by 4-byte tags, each structured in a documented way and serving a different purpose. The design is backwards compatible, but also trivial to extend with vendor-specific tables. Presently, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are a total of around 50 tables in existence, but only ~20 can be considered somewhat important, and even fewer are obligatory. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can also be categorized depending on whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are TrueType-specific, OpenType-specific, or common between those two. Detailed information on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most fundamental tables can be found in Microsoft's OpenType specification.

The essential observation about SFNT tables is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are all completely different. They differ in length, structure, importance, nature of stored data etc. With this in mind, it only seems reasonable to treat each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m individually racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than equally. However, nearly every publicly discussed font fuzzer approached cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mutation step in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 opposite way: by first mutating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TTF/OTF file as a whole (not considering any of its internal structure), and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n fixing up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 table checksums in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 header, so Windows wouldn't immediately refuse to load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. In our opinion, this was vastly suboptimal.

In order to get some concrete numbers, we went through our font corpus to discover that on average, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were ~10 tables whose modification affected cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 success of a font's loading and displaying. Intuitively, a mutation strategy is most powerful when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resulting files are successfully processed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tested software 50% of times, and likewise fail to parse cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r 50% of times. This indicates that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 test cases are on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 verge of being valid, and shows that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 configuration is neicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r too aggressive, nor too loose. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of SFNT fonts, if one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tables gets damaged too severely, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire file will fail to load, regardless of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r tables. If we denote cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 probability of each table succeeding to load with a specific mutation strategy as image00.png, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 probability for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole file is image01.png, or:

image02.png

or if we assume that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 probabilities for all tables should be equal (we want to fuzz cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m uniformly):

image03.png

If we insert cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 averaged out image04.png and an ideal image05.png, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n:

image06.png

So, as a result, we wanted to configure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mutator such that for each table, its mutated form could still be successfully processed ~93% of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time (at least on average).

The dumb algorithms we chose to mutate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tables were Bitflipping (flips 1-4 consecutive bits in randomly chosen bytes), Byteflipping (replaces randomly chosen bytes with ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r values), Chunkspew (copies data over from one location in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r), Special Ints (inserts special, magic integers into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input) and Add Sub Binary (adds and subtracts random integers from binary data). Since each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 algorithms affected data in a different way, we had to determine cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 average most optimal mutation ratio for each table/algorithm pair.

To facilitate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 task, we developed a program which loaded each file in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corpus, iterated through each table and algorithm, and determined cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mutation ratio which would result in a ~93% font loading success rate through bisection. After processing all files, we averaged cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 numbers, set some generic mutation ratios for tables whose mutations did not appear to affect font loading (but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y could potentially still be parsed somewhere), and ended up with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following table:

Table / mutation
Bitflipping
Byteflipping
Chunkspew
Special Ints
Add Sub Binary
hmtx
0.1
0.8
0.8
0.8
0.8
maxp
0.009766
0.078125
0.125
0.056641
0.0625
OS/2
0.1
0.2
0.4
0.2
0.4
post
0.004
0.06
0.2
0.15
0.03
cvt
0.1
0.1
0.1
0.1
0.1
fpgm
0.01
0.01
0.01
0.01
0.01
glyf
0.00008
0.00064
0.008
0.00064
0.00064
prep
0.01
0.01
0.01
0.01
0.01
gasp
0.1
0.1
0.1
0.1
0.1
CFF
0.00005
0.0001
0.001
0.0002
0.0001
EBDT
0.01
0.08
0.2
0.08
0.08
EBLC
0.001
0.001
0.001
0.001
0.001
EBSC
0.01
0.01
0.01
0.01
0.01
GDEF
0.01
0.01
0.01
0.01
0.01
GPOS
0.001
0.008
0.01
0.008
0.008
GSUB
0.01
0.08
0.01
0.08
0.08
hdmx
0.01
0.01
0.01
0.01
0.01
kern
0.01
0.01
0.01
0.01
0.01
LTSH
0.01
0.01
0.01
0.01
0.01
VDMX
0.01
0.01
0.01
0.01
0.01
vhea
0.1
0.1
0.1
0.1
0.1
vmtx
0.1
0.1
0.1
0.1
0.1
mort
0.01
0.01
0.01
0.01
0.01

Even with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 accurate numbers listed above, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are just average results based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entirety of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corpus, so using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact same values for all fonts wouldn't work out great. This is especially true since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 size and complexity of input samples varies heavily, ranging from 8 kilobytes to 10 megabytes. Consequently, data density and distribution in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tables vary as well, requiring individual mutation ratios to reach cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desired parsing success rate. In order to address that and provide cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzer with even more freedom, instead of using a fixed ratio in every iteration, in each pass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzer would choose a temporary ratio from a range of image07.png, image08.png being cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 calculated ideal rate.

With cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above configuration and a trivial piece of code to disassemble, modify and reassemble SFNT files (written in C++ in our case), we were now able to mutate fonts in a smart-dumb way. While we were still just randomly flipping bits and employing similarly simple algorithms, we had some degree of control of how Windows would react to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 average mutated font.

15 out of 16 vulnerabilities discovered during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 effort were found with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above mutation configuration.

Generating TTF programs

Adding some "smart" logic into an ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise completely dumb fuzzing process is a significant improvement, but it's important to be aware that it might still be insufficient to discover certain classes of font handling bugs. A large part of most TTF and OTF files, sometimes even a majority, is consumed by glyph outline programs written for dedicated TrueType / PostScript virtual machines. These virtual machines are quite fragile in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context of fuzzing, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y abort program execution as soon as an invalid instruction is encountered. Consequently, dumb algorithms operating on "black-box" bitstreams with no knowledge of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir structure would exercise a very limited portion of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM, as each program would be very likely to crash after executing just a few instructions.

This is not to say that conventional mutations can't be useful for finding VM bugs. Vulnerabilities which could be triggered by changing a single instruction to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, or flipping an instruction argument could very well be discovered that way, and actually were in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past. This is why we allowed mutations in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "prep", "fpgm" and "glyf" tables, which contained TrueType programs. In fact, a vulnerability in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "IUP" instruction handler was indeed discovered with a dumb fuzzer.

However, we suspected that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re might have also been bugs which required specific, long constructs of valid instructions in order to manifest cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves. The suspicion was also supported by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security review of CharString processing code in ATMFD, where most crashes could only be provoked with three or more concrete instructions. Such constructs are extremely unlikely (to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 point of being unrealistic within reasonable time) to be generated by a dumb algorithm, especially with missing coverage guidance. As I had already spent weeks auditing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 virtual machine implemented in ATMFD, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was no reason to fuzz-test it furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. The problem only had to be addressed for TTF, and our idea to do it was to use a dedicated TrueType program generator, which would output streams of structurally valid instructions (with random arguments) and embed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m into existing, legitimate TTF fonts. Below, we proceed to describe how we managed to achieve that effect.

SFNT formatted fonts (both TTF and OTF) can be dissected into human-readable .ttx files (XML-structured) with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ttx.py utility as part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 FontTools project, and reassembled back to binary form. This is greatly useful for convenient inspection of internal font structures and modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in any desired way. The project also understands TrueType instructions, and is able to disassemble and assemble back whole programs written in that language. The instruction streams are located within tags, as shown below:

 
   
     
       PUSH[ ]  /* 16 values pushed */
       6 111 2 9 7 111 1 8 5 115 3 3 8 6 115 1
       SVTCA[0]
       MDAP[1]
       MIRP[01101]
       SRP0[ ]
     
   
 

What we started with was a bit of pre-processing: we converted all .ttf files into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir corresponding .ttx versions, and wrote a short Python script (using xml.etree.ElementTree) to remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 body of all tags. Embedding generated programs into existing, legitimate fonts is largely superior to inserting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m into a single, minimalistic TTF template. The TrueType instructions are tightly connected to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r characteristics of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir hosting fonts (points, contours, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r settings), so having a diverse set of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m (similarly to mutational fuzzing) couldn't hurt us, but could only help.

The next step was to write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual generator, which would both generate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 instructions and embed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right places of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 .ttx files. Most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 work involved reading through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TrueType instruction set specification, and implementing a generator of each instruction individually. Some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 instructions (such as RTHG, ROFF or FLIPON) were trivial to handle, while ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs were much more complex. Overall, in order to make sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 programs were correct and wouldn't bail out very quickly, we also had to add processing of ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r portions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font:

  • Count cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of contours and points in each glyph, in order to be able to generate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir valid indexes as instruction arguments.
  • Follow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current zone pointers (ZP0, ZP1, ZP2) set by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SZP0, SZP1, SZP2, SZPS instructions, also to be able to generate valid contour and point indexes.
  • Expand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "CVT" table to 32768 elements with random values.
  • Adjust many fields in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "maxp" table for our convenience, so that we wouldn't hit any limits arbitrarily set by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hosting font.

After a few days worth of development and testing, we ended up with a tt_generate.py script, which took .ttx files as input, and created ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r .ttx files with all structures properly adjusted and containing long streams of mostly correct instructions for each glyph on output. After recompilation with ttx.py, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font could be loaded and displayed similarly to test cases created through dumb fuzzing.

The first vulnerability cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 generator found was obviously cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "IUP" bug, as it only required setting ZP2 to 0 through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SZP2/SZPS instructions, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n invoking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IUP instruction. As this sequence was generated very frequently, we had to actively avoid it in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code (by always setting ZP2 to 1 before emitting IUP) before a patch for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue was released. Then, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 generator found one more unique bug (this time missed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dumb approach) in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 2nd iteration of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzing (issue #507): a pool-based buffer overflow in text drawing functions (win32k!or_all_N_wide_rotated_need_last and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r related routines).

With one unique, serious bug and one collision with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 result of mutational fuzzing, we still believe cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 effort put into writing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TTF generator was worthwhile. :-)

Kernel fuzzing in Bochs

One of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fundamental assumptions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 project was to make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzing scalable, preferably on Linux systems with no virtualization support available. This premise considerably limited our choice of infrastructure, since we are talking about fuzzing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows kernel, which must run as a whole, but also requires some hypervisor above it to be able to detect crashes, save offending test cases and so forth. The qemu project sounded like an intuitive idea, but anyone familiar with our Bochspwn research knows that we greatly enjoy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Bochs x86 emulator and its instrumentation support. Systems running in full emulation mode are very slow (up to ~100 MHz effective frequency), but with potentially thousands of machines, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 20-50x slowdown is still easily scaled against. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, we already had extensive experience in running Windows on Bochs, so we could start implementing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzing logic in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 instrumentation without worrying about any unexpected entry-level problems.

In order to save cycles inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 guest and speeds things up, we decided that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font mutation/generation would take place outside of Windows, within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Bochs instrumentation. The only thing that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 emulated system would be responsible for is requesting input data from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hypervisor, loading it in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system and displaying all glyphs in various styles and point sizes. The entire guest-side logic was included in a single harness.exe program, which automatically started at boot time and began testing fonts as soon as possible.

The above design required some channel of communication between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 harness and Bochs instrumentation. How? If we realize that we're running an emulator, and thus control every part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 virtual CPU's execution, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 answer becomes obvious: by detecting some special state which never occurs during normal execution, but can be easily set by our process inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM. In our case, we decided to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 LFENCE x86 instruction as a communication channel between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two environments. The opcode is effectively a no-op and is (almost) never used during regular system operation, making it a perfect candidate for this feature. Its execution can be detected with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BX_INSTR_AFTER_EXECUTION callback:

void bx_instr_after_execution(unsigned cpu, bxInstruction_c *i);

In our design, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operation code was passed through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 EAX register, and input/output parameters through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ECX/EDX registers. We implemented a total of three operations facilitating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 copying of font data to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 guest, informing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 success or failure of its loading, and sending textual debug messages:

  • REQUEST_DATA(lpBuffer) – sent by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 harness to receive fresh font data to test cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel against. The lpBuffer argument contains a virtual address of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer where data should be copied by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hypervisor.
  • SEND_STATUS(dwStatus) – sent by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 harness to inform cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host if loading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most recent font succeeded or not.
  • DBG_PRINT(lpMessage) – sent by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 harness to log a textual message.

In addition, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data received in response to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first REQUEST_DATA message was always cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original, non-mutated data of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sample file. This was to make it possible for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 harness to extract valid LOGFONT structures describing fonts contained within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file, which were cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n used to load and display cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in all subsequent iterations. The workflow is illustrated in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 diagram below:


As you can see, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scheme is very simple. Sending cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 debug messages and status information made it possible to aggregate runtime information from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzing sessions, and occasionally make sure that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were running correctly, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 goal of an average font loading ratio of 50% was really met. The font mutation/generation step implemented in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 instrumentation was of course synchronous, meaning that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 execution of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 LFENCE instruction in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 guest would not return before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sample data was copied to memory. The mutation stage was racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r fast, as it was written in C++ and executed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same process. The TTF program generation variant was much slower, as it involved starting an out-of-process Python generator, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ttx.py script to assemble cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font back to binary form. However, compared to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time period of a single font test inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 guest (ranging from 0.5s to several minutes), it was still a neglectable overhead.

Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r interesting point is that while copying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font data into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user-mode process memory inside of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM was generally quite simple (using a write_lin_mem function similar to Bochspwn's read_lin_mem, see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation in mem_interface.cc), we had to make sure that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 virtual address passed to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hypervisor had a corresponding physical memory mapping (i.e. was committed and not paged out). Memory allocated in Windows userland through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 standard allocators or VirtualAlloc are by default pageable, which can be addressed by eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VirtualLock function, or simply writing data to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocated memory area, which also ensures that it will remain mapped in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 near future.

With this design, we could now scale cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows kernel font fuzzing to any number of machines, regardless of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host operating system (as long as it could run Bochs) and whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r hardware virtualization support was available or not. Again, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only significant problem was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 speed of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 guest systems, but with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resources at our disposal, it was easy to balance cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 emulator's overhead and go far beyond cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 abilities of a single high-performance PC. We also undertook a number of steps to optimize cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tested Windows installation as much as possible (both in terms of size and background execution), which is detailed in one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next sections.

The client harness

Next to mutating and generating fonts in a way that makes it most likely for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tested software to crash, exercising cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input-processing code paths in an exhaustive manner is probably cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most crucial part of fuzzing. Even if we have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 smartest mutators, most effective error detection mechanisms and millions of machines to use, automated testing won't accomplish much if it never executes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable code. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code does execute but only touches 1% of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input data in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process, our chances of triggering a crash are vastly (and unnecessarily) limited. This is why we believed that much care had to be put into implementing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client harness, in order to ensure that all font-related attack surfaces would be tested against all data included in each input font. The approach was a complete opposite of some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r fuzzing efforts in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past, whose entire font testing consisted of firing up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 default Windows Font Viewer program against malformed fonts, or only using it to display characters within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 printable ASCII range, with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 default style and point size.

To start with, every file can contain multiple fonts, whose number is returned by a successful call to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AddFontResource function. In order to enumerate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in a way cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can be distinguished by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system, we used an undocumented GetFontResourceInfoW function (exported by gdi32.dll) with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 QFR_LOGFONT parameter. The function operates on files saved to disk, and with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specific argument used, it returns an array of LOGFONT structures, each describing one embedded font. This is why cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initial dry run iteration was necessary: to extract cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 descriptors from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original, unmodified font file (guaranteeing consistency of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 information).

The dry run was also cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only time cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 harness operated on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file system. For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual loading of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fonts for testing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, we called cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AddFontMemResourceEx function, which installs fonts directly from memory instead of files, which in this case resulted in an enormous performance improvement. The LOGFONT structures were passed directly as parameter of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CreateFontIndirect function, which created GDI font objects and returned handles of type HFONT. The handles were cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n passed to SelectObject, setting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current one in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specified Device Context. In our harness, we created five font objects per each extracted LOGFONT: one with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir original contents, and four with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 height, width, italic, underline and strikeout properties chosen semi-randomly (with a constant srand() seed).

For each such font object, we wanted to display all supported glyphs. As we quickly found out, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GetFontUnicodeRanges function was designed exactly for this task: listing out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 unicode ranges of characters which have corresponding outlines in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font. With this information, we called cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DrawText API for every 10 subsequent characters. In addition, we also called cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GetKerningPairs function once per font, and GetGlyphOutline with various parameters for every glyph. Overall, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 harness was very fast all operations were performed in-process, with hardly any interaction with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 syscalls operating on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tested fonts and related graphical objects. On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r hand, we believe that it managed to exercise most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 relevant attack surface, which is somewhat confirmed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 16 crashes were triggered through four different system calls: NtGdiGetTextExtentExW, NtGdiAddFontResourceW, NtGdiGetCharABCWidthsW and NtGdiGetFontUnicodeRanges.

Optimizing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system and detecting bugchecks

Considering that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire operating system was running in full software x86 emulation mode, which incurred an enormous overhead, every single emulated CPU cycle was extremely precious. Consequently, we wanted to make sure that as few irrelevant instructions were executed as possible, to make some breathing room for our harness, and most importantly cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel drivers performing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual font processing. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r goal was to reduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hard drive image with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 smallest possible size, so that it could be quickly distributed to all machines running cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzer.

We undertook a number of actions to optimize cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 speed and size of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system:

  • Changed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 graphical cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365me to Classic.
  • Disabled all services which were not absolutely necessary for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system to work (only left a few critical ones).
  • Set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 boot mode to Minimal/Safe Boot with VGA, so that only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 core kernel-mode drivers would be loaded.
  • Uninstalled all default Windows components (games, web browser etc.).
  • Set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "Adjust for best performance" option in System Properties.
  • Changed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 default shell in registry from explorer.exe to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzing harness, so that Explorer would never start in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first place.
  • Removed all items from Autostart.
  • Disabled disk indexing.
  • Disabled paging.
  • Disabled hibernation.
  • Removed most unnecessary files and libraries from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 C:\Windows directory.

With all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above changes, we managed to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 disk image size down to around 7 gigabytes, and have it start in Bochs in under five minutes. Of course, when preparing images for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 2nd and 3rd iterations, many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 changes had to be reverted in order to update cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n applied back.

Interestingly, one of our optimization changes affected cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reproducibility of issue #684. While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug was reported to Microsoft on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same day as ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r results of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 3rd iteration, after two weeks cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor informed us that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were unable to get a repro. Following some back-and-forth communication, we took a closer look into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 possible configuration differences between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 default installation and our testing environment. We cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n quickly realized that as part of setting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "Adjust for best performance" option in System Properties, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "Smooth edges of screen fonts" setting was unchecked, while it is enabled by default. It turned out that indeed, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability only manifested with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 option disabled. When Microsoft confirmed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y could now reproduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem, we updated cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Reported date in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tracker, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor fixed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new 90-day window.

When it comes to detecting system bugchecks, we chose cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 easiest solution, instructing Windows to automatically restart when a critical system crash occurred:


On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Bochs instrumentation side, a system restart could be trivially detected with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following callback:

void bx_instr_reset(unsigned cpu, unsigned type);

We could rely on a system restart as an indicator of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crash, because it was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only reason Windows could possibly shut down: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 harness was set to work indefinitely, and hardly any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r services or processes ran in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 background (i.e. no Windows 10 Upgrade Tool). One major drawback of this solution was that at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 point of a system restart, no context information (registers, flags, stack trace) was available anymore, not to mention having access to a system crash dump or any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r crash-related information. The only trace of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bugcheck was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font file itself, but thanks to mechanisms such as Special Pools, and having an exact copy of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzing environment prepared for reproduction, this turned out to be mostly sufficient. We were able to reproduce nearly all crashes occurring in Bochs based solely on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 saved test cases.

Of course, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a lot of room for improvement in this area. A better instrumentation could try to filter kernel exceptions and acquire CPU context information from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, hook into disk access in order to intercept cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crash dump file being saved to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filesystem, or at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very least make a screenshot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Blue Screen of Death, to get some basic idea about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crash (bugcheck type, four arguments). However, since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 simplistic implementation worked so reliably for us and only took a few minutes to set up, we didn't feel cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 need to complicate it.

Reproducing crashes

Crash reproduction was generally one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 easiest stages of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process. We used a VirtualBox VM with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact same environment as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzer, and modified cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font-loading harness to load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font from a file instead of requesting it through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 LFENCE instruction. Then, we also had to write a simple "reproducer" program, which followed a very simple scheme:
  1. Load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last processed sample from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 progress.txt file (if it exists).
  2. Check if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are any crash dumps saved under C:\Windows\Minidumps.
    1. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is one, copy it into a VirtualBox shared directory, under cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last font file.
    2. Start WinDbg, use it to generate a textual report of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crash dump (!analyze -v), and copy it into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same directory.
    3. Remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crash dump locally.
  3. List files in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input directory, skipping cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m until cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last processed one is found. Choose cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next one and save its name in progress.txt.
  4. Start cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 modified harness several times (just to be sure, one should generally be enough).
    1. If a crash occurs, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system automatically saves a crash dump and restarts.
  5. If we're still running at this point, it means that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crash is non-reproducible. In order to make sure that no corrupted system state persists when processing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next sample, restart cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system "manually" (through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ExitWindowsEx API).

Thanks to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above algorithm, once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reproduction was over, we conveniently ended up with a list of directories corresponding to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crashing samples, and containing both binary crash dumps and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir textual representations that we could easily grep through or process in ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r ways. By doing a full system reboot, we could also be 100% sure that each system crash was indeed caused by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one particular font, as no previously loaded ones could have affected cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 result. The downside was of course cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 increased time cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overall process takes, but with an extremely optimized system which took <50 seconds to boot and usually anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r <10 seconds to test cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 throughput was somewhere at ~1500 samples a day, which was acceptable to process cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 output of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first (most crashy) run in just a few days.

The only tweaks applied to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reproduction system as compared to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzing one were to add cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reproducer program to Startup, reduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time spent in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "Windows Error Recovery" boot screen (appearing after a system crash) to 1 second, set up Shared Folders and install WinDbg to be able to generate textual crash dump excerpts within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 guest itself. We also prepared a corresponding Windows 7 64-bit reproduction VM with more RAM, to potentially give Special Pools more memory to work with, but it didn't turn out to be very useful, as crashes generally eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r reproduced on both builds, or didn't on any of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.

Minimizing samples

There are two types of sample minimization which can be performed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context of SFNT fonts: table-granular and byte-granular (within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scope of each table). Of course, both of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m only make sense for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results of mutational fuzzing. When reporting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crashes to Microsoft, we only performed first-level, table granular minimization, which served two purposes: to satisfy our curiosity and to help deduplicate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crashes. Especially in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first iteration, when we had to deal with dozens of various stack traces, it was largely helpful to know which bugcheck was caused by mutations in which table(s).

The minimization tool was trivial in design: it used our existing C++ SFNT library to load both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original and mutated samples, and display a list of equal and differing tables. The user could cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n restore a chosen table (insert its original contents in place of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 malformed one) and test if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new font would still trigger a crash. If yes, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n mutations in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 table were irrelevant and could be skipped; ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise, at least some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m were essential for triggering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug and had to be preserved. After a few repetitions, we were left with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 1-3 tables which were essential to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crash.

Byte granular minimization was only performed for several specific samples, in order to find out which fields in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 font structures were cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 culprit of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crashes. Since none of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mutation algorithms changed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 size of any of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tables (only modified data in a "static" way), a very simple algorithm could be used: in each iteration, half of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 currently differing bytes would be restored in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mutated file. If a bugcheck still occurred, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se bytes were unessential and could be forgotten about. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was no crash anymore, some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bytes must have been important, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iteration's changes were reverted, and anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r subset of bytes was chosen to be tested. Minimization was complete when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 set of differing bytes could no longer be reduced after a large number of attempts.

A separate minimization algorithm could be potentially devised for outputs of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TTF program generator; however, since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was only one such unique crash, and we didn't intend to perform its detailed root cause analysis, we didn't develop it in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end.

Future work

While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 project has been more fruitful than we originally expected, in large part thanks to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 individual approach to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file format and tested software, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are still a number of directions for furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r improvement. We've summarized cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list below:

  1. Coverage-guided fuzzing.
    The entire fuzzing process ran with no code coverage feedback enabled, which limited its ability to discover new code paths and have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corpus evolve towards a more comprehensive one. As AFL, LibFuzzer and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r coverage-guided fuzzers have recently shown, this single feature can improve fuzzing results by an order of magnitude, depending on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target software, nature of input data and quality of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initial corpus.

    In our specific scenario, however, adding coverage recording and/or analysis to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Bochs instrumentation was not a feasible option, as it would incur furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, significant overhead to a system which was already running extremely slowly. There are also ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r problems to address, such as how to distinguish instructions processing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input data from ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r kernel code, etc.

    The idea is related to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more general concept of performing coverage-guided Windows kernel fuzzing (Linux already has it, see syzkaller), regardless of whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r it's fonts, system calls or some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r attack surface. This is, however, a subject for a whole separate research, probably best implemented with real virtualization and VMI (Virtual Machine Introspection) for enhanced performance.

  2. Improved mutations.
    While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mutation strategy used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 project was somewhat smarter than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 average one observed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are still many ways to make it better. This includes adding more diverse dumb mutators, adding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to chain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, splicing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tables of multiple samples into a single font, or determining mutation ratios on a per-font basis (instead of averaging out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire corpus).

    Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r ideas include challenging cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 assumption that we manually found all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bugs in CharString processing and writing an instruction stream generator for OTF fonts, finding a way to fuzz-test SFNT tables which we previously deemed to be too fragile to mutate (cmap, head, hhea, name, loca and so on), or mutating fonts based on a representation ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 compiled, binary form (e.g. cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XML .ttx files generated by FontTools).

  3. Fuzzing on ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r Windows versions.
    The project was run on Windows 7 from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end, with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 assumption that it could contain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most bugs (e.g. those not backported from Windows 8.1 and 10). However, it is possible that newer platforms may include some added functionality, and fuzzing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m could reveal vulnerabilities not present in Windows 7.

  4. Improved Bochs crash detection.
    As mentioned in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous section, crash detection was originally implemented based on a very simple indicator in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form of a machine reboot. This effectively limited cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 amount of crash context information we could collect to none, which made it impossible to investigate crashes which didn't reproduce with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 saved sample. One potential solution could be to set up a callback for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BX_INSTR_EXCEPTION event, in order to catch CPU exceptions as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y occur, and extract context information from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re. This option also has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 additional advantage that it could be used to signal kernel-mode exceptions which are typically masked by generic exception handlers, but still manifest real bugs.

    Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r options, such as hooking into disk access in order to intercept crash dumps being saved to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filesystem, or making screenshots of BSoDs displayed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel are also viable choices, but much less elegant and still quite limited in terms of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scope of information being obtained.

Summary

As a software testing technique, fuzzing has a very low entry bar and may be used to achieve satisfying results with little expertise or invested effort. However, it is still not a silver bullet in vulnerability hunting, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are many stages which may require careful configuration or individual tailoring for a specific target or file format, especially for non-trivial targets such as closed-source operating system kernels. In this post, we have demonstrated how we attempted to enhance cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process of Windows kernel font fuzzing to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 maximum extent within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 available time resources. We especially put a lot of energy into mutating, generating and exercising cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inputs in a decently effective way, and into scaling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzing process to thousands of machines, through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 development of a dedicated Bochs instrumentation and aggressive optimization of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system. The outcome of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 work, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form of 16 high-severity vulnerabilities, has shown that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 techniques were effective and improved upon previous work.

Considering how much potential fuzzing has and how broad cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subject is, we look forward to seeing it grow furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r and be used to accomplish even more impressive effects, while ceasing to be perceived as a voodoo technique which "just works" regardless of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 technical details behind it. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 upcoming weeks and months, we are also planning to share more of our experience and thoughts in this field.