Monday, November 14, 2016

[0day] [exploit] Compromising a Linux desktop using... 6502 processor opcodes on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NES?!

Overview
A vulnerability and a separate logic error exist in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 gstreamer 0.10.x player for NSF music files. Combined, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y allow for very reliable exploitation and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bypass of 64-bit ASLR, DEP, etc. The reliability is provided by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presence of a turing complete “scripting” inside a music player. NSF files are music files from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nintendo Entertainment System. Curious? Read on...

Demonstration, and affected distributions
Here is a screenshot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit triggering. Somewhat alarmingly, it does so without cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user opening cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit file -- cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y only have to navigate to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 folder containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file. More on that below.

xcalc_from_downloads_folder.png

You can download cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file: exploit_ubuntu_12.04.5_xcalc.nsf. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image above, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file has been renamed to “time_bomb.mp3”. We’ll cover why below.

As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filename suggests, this exploit works against Ubuntu 12.04.5. This is an old but still supported distribution. Specifically, for reproducibility, it works against _exactly_ Ubuntu 12.04.5, without furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r updates. If you take all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 updates, you’ll get a new glibc, which changes some code offsets and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit will crash. The crash is of course deterministic and it would be possible to code cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit to cater for arbitrary glibc binaries; this is left as an exercise for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reader.

The vulnerability is in libgstnsf.so, an audio decoder present in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 gstreamer-0.10 distribution. Ubuntu 12.04 uses gstreamer-0.10 for all its audio handling needs. Ubuntu 14.04 is apparently affected because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 default install includes gstreamer-0.10, but most media handling applications use gstreamer-1.0 which is also installed. The exact circumstances under which Ubuntu 14.04 uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable gstreamer-0.10 are not clear. The Ubuntu 16.04 default install has only gstreamer-1.0, which is not affected by this vulnerability.

This exploit works against what I would consider cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “default” install. During Ubuntu install, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s a question along cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lines of “hey, do you want mp3s to work?” and of course cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 correct answer is “yes”. Various extra packages are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n installed including gstreamer0.10-plugins-bad. This package includes libgstnsf.so.

Wait, what, an 0day, with an exploit and all?
Yes, an 0day.
As a learning experiment, most of my bug disclosures going forward are going to be 0day. I’ve got a lot of experience participating in so-called “co-ordinated disclosure”, where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 receiving vendor takes as long as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y wish to fix a vulnerability. (I once waited over a year(!) for Apple to fix a Safari vulnerability.) I’ve got significantly less experience with “full disclosure”, where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public receives details of a risk at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same time as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor. To be clear, I’m fairly certain that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 correct balance is a compromise somewhere between “full disclosure” and “co-ordinated disclosure”. The Project Zero 90-day deadlines appear to achieve this compromise nicely and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s a lot of data backing up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 policy.

Don’t worry, this particular 0day is very minor, only affecting very old Linux distributions; see above. This 0day is more about fun than impact. Future 0days may be more widespread ;-)

Philosophical 0day question
Is it still an 0day if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 patch is released alongside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 0day? Here’s cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 patch for Ubuntu 12.04:
sudo rm /usr/lib/x86_64-linux-gnu/gstreamer-0.10/libgstnsf.so

While at first glance, this “patch” would appear to remove functionality, it does not. Your wonderful NSF files will still play. WTF? Would you believe that Ubuntu 12 and 14 ship not one but two different code bases for playing NSF files? That’s a lot of code for a very fringe format. The second NSF player is based on libgme and does not appear to have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first.

The attack surface
This exploit abuses a vulnerability in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 gstreamer-0.10 plug-in for playing NSF music files. These music files are not like most ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r music files that your desktop can play. Typical music files are based on compressed samples and are decoded with a bunch of math. NSF music files, 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 hands, are played by actually emulating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NES CPU and sound hardware in real time. Is that cool or what? The gstreamer plug-in creates a virtual 6502 CPU hardware environment and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n plays cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 music by running a bit of 6502 code for a little while and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resulting values in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 virtualized sound hardware registers and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n rendering some sound samples based on that.

If you’re curious to play a real NSF file, feel free to download cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file: cv2.nsf. It’s cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 music from Castlevania 2, and you can find similar examples with a simple Google search for a term such as “nsf music files”. If your Linux desktop has support for NSF, you should be able to play it with something like: totem cv2.nsf. (Don’t be surprised if your distribution kindly offers to automagically install a suitable plug-in if one is missing.) It’s just 17264 bytes, which is tiny! Far too small to contain much in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way of samples, but large enough to contain some a small program which sequences requests for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 basic NES hardware to make some simple noises.

In order to actually exploit this vulnerability, or a vulnerability like it, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are various plausible and different avenues:

  • Send exploit via e-mail attachment. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim downloads and opens cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are compromised. Note -- for this to work, you likely need to rename exploit.nsf to exploit.mp3. Most Linux desktops don’t know what to do with an NSF file, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y’ll happily stuff any sequence of bytes in an MP3 file through a media player. Most gstreamer based media players will ignore a file’s suffix and use file format auto detection to load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most appropriate decoder.
  • Partial drive-by download. By abusing Google Chrome’s somewhat risky file download UX, it’s possible to dump files to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim’s Downloads folder when a booby trapped web page is visited. When cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Downloads folder is later viewed in a file manager such as nautilus, an attempt is made to auto thumbnail files with known suffixes (so again, call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NSF exploit something.mp3). The exploit works against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thumbnailer.
  • Full drive-by download. Again, abusing Google Chrome download UX, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s a path to a possible full drive-by download. This will be explored in a separate blog post.
  • USB drive based attack. Again, opening a USB drive opens up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thumbnailing attack described above.

6502 and NES ROM loading and paging crash course
The 6502 CPU is legendary, appearing in a diverse range of also legendary systems such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Nintendo Entertainment System, Commodore 64, BBC Micro, etc. It is 8-bit, but with 16-bit addressing, giving a 64kB address space. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NES application, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 upper 32kB of address space (0x8000 - 0xffff) is reserved for ROM, i.e. cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 read-only data on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cartridge you have stuffed in.

Here lies an interesting problem: what if you want to make a game larger than 32kB? Perhaps you have a game of 16 levels, each level having 16kB of unique graphics and music. No way that’s going to fit into 32kB. To solve this problem, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 concept of “banks” and “bank switching”. A bank is simply an aligned 4kB contiguous area of ROM, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are 8 of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m packed between 6502 addresses 0x8000 - 0xfffff. Each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se banks can be mapped to a contiguous, aligned 4kB region inside a cartridge ROM that is potentially much larger than 32kB. At runtime, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NES program can write to a special magic memory location (0x5ff8 - 0x5fff) that contains hardware registers that control what portion of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM is mapped to which bank.
Example: if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 6502 CPU writes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value 10 to 0x5ff9, 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 6502 memory locations 0x9000 - 0x9fff will be backed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bytes at index (10 * 4096) into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cartridge ROM.

The vulnerabilit(ies)
1: Lack of checking ROM size when mapping into 6502 memory and bank switching
(Absent a CVE, you can uniquely identify this as CESA-2016-0001.)
There is a near total lack of bounds checking on proposed ROM mappings. This applies to be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initial ROM load, as well as subsequent ROM bank switching. All of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 handling for ROM mapping is in gst-plugins-bad/gst/nsf.c, including:

nsf_bankswitch (uint32 address, uint8 value)
{
 ...
 cpu_page = address & 0x0F;
 roffset = -(cur_nsf->load_addr & 0x0FFF) + ((int) value << 12);
 offset = cur_nsf->data + roffset;
 ...
 cur_nsf->cpu->mem_page[cpu_page] = offset;
 …

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above code snippet, cur_nsf->data points to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual ROM data content of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input music file. The format of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file is pretty simple: a 128 byte header (starting with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 4 character sequence “NESM”) and anything following is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM. So, for example, if you had a 200 byte input file, that would be 128 bytes of header and 72 bytes of ROM. The entire ROM is kept in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host emulator heap via a single malloc(). As can be seen, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pointer named offset is taken as an arbitrary offset into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM heap memory with no checking against any kind of length!

Let’s make this problem concrete: even in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 simplest ROM load case of our 200 byte file, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 virtual ROM load address will be 0x8000 and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 loading code will call nsf_bankswitch() for addresses 0x5ff8 - 0x5fff, with ascending bank indexes 0 - 7. This will result in 6502 virtual address 0x8000 being backed by nsf-> data + 0, 0x9000 backed by nsf->data + 4096, … all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way to 0xf000 backed by nsf->data + (7 * 4096). So even in this very simple example case, reading linearly in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 6502 emulator from 0x8000 to 0xffff will result in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 read of 72 bytes of real ROM data followed by 32696 bytes of out of bounds heap data!

But this is just an out of bounds read, because virtual addresses 0x8000 - 0xffff are read only in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 emulator. An OOB read is not particularly serious in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 emulator. It could be used as a useful tool to bypass ASLR, but any sensitive data read in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host heap can only be used to play sound. The emulator doesn’t have any advanced functionality such as e.g. cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to egress heap data via network connections. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most serious case, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 emulator were running as part of an internet server for music conversion, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker could render parts of OOB heap content as sound waves in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 output file, to try and steal interesting data from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server’s heap.

However, a second logic quirk of this particular emulator makes things more serious:

2: Ability to load or bank switch ROM to writable memory locations
(Probably not an actual vulnerability per se; no identified assigned.)
Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r NES music players I’ve looked at do not permit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 loading or bank switching of ROM data at addresses below 0x8000. But this particular player does, eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r via a ROM load address in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file header that is below 0x8000, or via writes to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bank registers 0x5ff6 or 0x5ff7 (ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r emulators do not even have bank registers as low as 0x5ff6 or 0x5ff7):

static nes6502_memwrite default_writehandler[] = {
 {0x0800, 0x1FFF, write_mirrored_ram},
 {0x4000, 0x4017, apu_write},
 {0x5FF6, 0x5FFF, nsf_bankswitch},
 {(uint32) - 1, (uint32) - 1, NULL}
};

Writing e.g. 0x00 to 0x5ff6 will result in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first 4096 bytes of ROM being mapped read and write at 6502 virtual address 0x6000. In our 200 byte file example, this means that a subsequent write of 0x41 to virutal address 0x6048 will result in 0x41 being written out of bounds relative to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host emulator heap.

As can be appreciated, we now have a lot of read and write control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host emulator heap and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more experienced exploit writers will realize that successful exploitation is already all but assured.

The exploit: overview
Here is an image of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit file inside okteta, a hex editor:

nsf_exploit_okteta.png

This is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full exploit and as you can see, it’s pleasingly compact at 416 bytes. The image has been decorated with three colored lines that show cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 different pieces of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit file:

  • Blue, for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 128 byte header. Much of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 header is irrelevant and in fact, clever exploit techniques could conceivably compress some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 payload into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 header. It would be a beautiful challenge to take this exploit and try and do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same in as few bytes as possible :) In terms of significant fields in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 header:
    • 0x8000 (little endian, as are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subsequent values) at offset 8. This is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 virtual ROM load address.
    • 0x8070 at offset 10. The virtual address of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initial 6502 routine that is called once.
    • 0x80a0 at offset 12. The virtual address of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 per-frame 6502 routine.
    • 0x41a1 at offset 110. The frame timing. Needs to be left alone to ensure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sound engine works.
  • Orange, for metadata, at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 start of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM image directly after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 header. This metadata is loaded at virtual address 0x8000 and is available and used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 6502 program. The metadata includes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string “xcalc”, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 eventual payload, a constant to search for in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap to make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit reliable, and a table of reads, additions and writes to perform on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main heap in order to progress cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit.
  • Green, for real 6502 opcodes -- yay! The exploit proceeds via a program written entirely in 6502 assembly. The music playing emulator will emulate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se opcodes, but break out of virtual 6502 address space into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host emulator main heap on account of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability details outlined above.

The exploit: details
So how does cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit work to reliably pop a calculator in so few bytes? The exploit is 416 bytes: 128 bytes of header and 288 bytes of ROM which are mapped at virtual 6502 address 0x8000. The ROM consists of a bunch of metadata followed by some 6502 opcodes.

In order to explore 6502 and “compile” 6502 assembly, this web page is a nice resource: Easy 6502. The page also makes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 claim “6502 is fun!” -- I concur. The reasonably commented 6502 assembly source for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 opcodes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit is here: asm_final_main.asm. With a couple of tiny extra routines: asm_final_init.asm, asm_final_adder.asm.

The exploit proceeds as follows:
1: Locate important metadata object of type nes6502_context in main heap
Because of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability noted above, any read from 0x8120 - 0xffff will read out of bounds in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host heap, so we can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore read out of bounds until we locate bytes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host heap that we believe correspond to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 nes6502_context object, which is defined like this:

typedef struct
{
  uint8 * mem_page[NES6502_NUMBANKS];  /* memory page pointers */
  ...
  nes6502_memread *read_handler;
  nes6502_memwrite *write_handler;
  int dma_cycles;
  uint32 pc_reg;
  uint8 a_reg, p_reg, x_reg, y_reg, s_reg;
  uint8 int_pending;
} nes6502_context;

Why are we keen to locate this particular object? For two reasons. Firstly, it controls how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 6502 virtual memory accesses map to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host heap. By taking control of this mapping, we’ll get read and write access anywhere in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 virtual memory of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 host process. Secondly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object contains pointers into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BSS section. Locating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BSS is important later in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit.

We identify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object in memory via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 byte sequence 00 00 00 00 00 50 00 00 00 00 00 00 ff 00 00 00 (which you can find in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit file at ROM offset 0), on a 16-byte alignment, which corresponds to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initial values in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fields from dma_cycles to s_reg. (Due to a bug, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se initial values are never synced with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real current register values, so we can search for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m reliably.)

2: Remap cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 6502 virtual read write address 0x6000 to point to nes6502_context::mem_page[6]
It would be remiss of me not to cite some beautiful 6502, so here’s cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code that writes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 magic hardware register to map 0x6000 to out of bounds ROM:
; Some fairly simple calculations and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n memory bank remapping.
; Match address is stored at 0x02, e.g.: 0x91b0
; Subtract 0x60 from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 match address.
; This indexes earlier into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real heap metadata object.
; It indexes to a real pointer to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 backing heap for 6502 0x6xxx RAM.
; Subtract 0x8000 to get offset from ROM base.
LDA $02
SEC
SBC #$60
STA $02
LDA $03
SBC #$80
STA $03
; Now, 0x02 contains e.g. 0x1160
; Shift cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most significant byte to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM bank id.
; Each bank is 0x1000 in size.
LSR
LSR
LSR
LSR
; In this case, our bank id is 1.
; Write 1 to magic hardware register 0x5ff6.
; Causes 0x6xxx RAM to map to 0x1000 into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM.
; Which will be out of bounds relative to main host heap :-)
; Note that 0x6xxx is writable whereas 0x8xxx+ is not, so we need this.
; Offset e.g. 0x160 into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 0x6xxx space is a main heap pointer.
; This main heap pointer can be read/written from 6502 at e.g. 0x6160.
STA $5ff6
If you’re not familiar with 6502, hopefully you got an idea of some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 simple elegance of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 opcodes. Perhaps you also noted some headaches:
  • There’s no instruction to bitshift by a variable amount. Hence, 4 LSR’s in a row (logical shift right) to effectively do what is >> 4 in C.
  • This really is an 8-bit processor, no 16-bit registers, so a simple 16-bit calculation has to be broken into two halves with careful management of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 carry flag! (SBC is SuBtract with Carry.)

Once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 correct ROM bank is mapped writable, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s a furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r normalization calculation which actually adds cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bank offset to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 raw host heap pointer nes6502_context::mem_page[6]. This is a very precise memory corruption and it takes effect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next frame. It ensures that 0x6000 points exactly to nes6502_context::mem_page[6] for all possible bank offsets that we might have located it at.

3: Start a series of read / add / write sequences, in a one-per-frame loop
With a normalized 6502 virtual address 0x6000 that points exactly to nes6502_context::mem_page[6], we’re in good shape to start reading and writing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full host heap (and stack / BSS / whatever pointers we can find and follow or calculate!) with perfect accuracy, using 6502 opcodes. If we modify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mem_page array, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 effect is not visible to 6502 memory accesses until cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next frame, so we simply do one memory modification per frame.
The table used to drive cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 read / add / write loop is located at ROM offset 0x20 and each entry is 8 bytes, e.g. cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first one:
50 60 08 60 60 6f ff ff
This means, read 8 bytes from virtual address 0x6050, add (sign extended, effectively a subtraction) 0xffff6f60 to that 8 byte value, and write it back to virtual address 0x6008.

4: Calculate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 libgstnsf.so BSS
We’re in luck: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of nes6502_context::read_handler, which now is readily available at virtual address 0x6050, is at a fixed value from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 start of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BSS because it points to an object in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BSS. We calculate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 start of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BSS and write it to virtual address 0x6008, which is nes6502_context::mem_page[7]. In ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r words, we just mapped a readable and writable view of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BSS at virtual address 0x7000 in our little 6502 CPU.

5: Edit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memset() GOT entry
At offset 0xf8 into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GOT exists cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memset() function pointer. This is a pointer into glibc. It is now mapped at virtual address 0x70f8. Do you know what else is in glibc, at a fixed relative offset? system(). By adding a fixed value to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memset() GOT entry, we ensure future calls to memset() will in fact call system().

6: Map cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual nes6502_context::read_handler object at 0x7000
Here’s cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 read_handler definition; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 read_handler pointer points to an array of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se:

typedef struct
{
  uint32 min_range, max_range;
  uint8 (*read_func)(uint32 address);
} nes6502_memread;

And here are some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entries that fill this array:

static nes6502_memread default_readhandler[] = {
 {0x0800, 0x1FFF, read_mirrored_ram},
 {0x4000, 0x4017, apu_read},
 {(uint32) - 1, (uint32) - 1, NULL}
};

As you can see, this object contains function pointers. Useful. Also useful are that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se function pointers are called in normal operation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 6502 memory accesses, when accesses to certain virtual addresses are made.

7: Change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 apu_read() function pointer
By accessing virtual address 0x7018, we’re now (thanks to step 6 above) accessing index 0x18 into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 read_handler BSS object. The apu_read() function pointer, called for reads of 0x4000 - 0x4017, is stored cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re. We add a little bit to this pointer (0x1d0) in order to in fact change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function pointer to apu_reset(). The reason will become apparent shortly!

8: Calculate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address of BSS variable apu, again using a fixed relative offset from nes6502_context::read_handler
apu is defined thusly:

/* pointer to active APU */
static apu_t *apu;

We write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 calculated address such that virtual address 0x7000 points to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of apu.

9: Copy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 apu pointer into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory bank mappings so we can dereference into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 apu object at virtual address 0x7000
Just chasing a level of pointer indirection here, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BSS value is just a pointer to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual object which is on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap.

10: Write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string “xcalc” into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 apu object
The apu object is quite large:

typedef struct apu_s
{
  rectangle_t rectangle[2];
  triangle_t triangle;
  noise_t noise;
  dmc_t dmc;
  uint8 enable_reg;

  apudata_t queue[APUQUEUE_SIZE];
  ...

By writing at 0x70f0, we write to offset 0xf0 into this object, which is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 queue buffer field. We write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string “xcalc” here.

11: Read from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address 0x4000
… and a calculator appears! Black magic? No, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous steps set things up carefully to cause this to happen. Here’s cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sequence:
  1. 6502 reads from 0x4000.
  2. This is a special memory address that is supposed to call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 apu_read() function pointer to handle cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 access.
  3. Instead, apu_reset() is called because we corrupted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function pointer earlier.
  4. apu_reset() contains cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code line: memset (&apu->queue, 0, APUQUEUE_SIZE * sizeof (apudata_t));
  5. But, we corrupted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memset() GOT entry to point to system(), and we wrote cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string “xcalc” to apu->queue.
  6. Ergo, system(“xcalc”) is executed, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 calculator appears.

Additional exploitation notes
This exploit works equally well when run in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following binaries:
  • totem
  • rhythmbox (works so well that two calcs are popped ;-)
  • gst-launch-0.10
  • nautilus (may launch a subprocess -- totem-video-thumbnailer?)

This is despite differing heap layouts. The code to scan cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 metadata object of interest, as opposed to relying on a fixed offset, is what provides most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reliability. The astute reader will note that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap scan runs only forwards and only for about 32kB. So what if heap jitter results in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 all important metadata object getting allocated before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM data? This is a definite possibility but does not appear to be a big bocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r in this instance. The NSF decoder runs in a fresh new thread, which in turn generally gets a new heap arena, resulting in decent determinism in heap layout. The metadata object is allocated temporally after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM data, so it will typically get placed after. That said, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROM data is made bigger, it can (deterministically, due to heap holes of deterministic size) end up after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 metadata object.

Our closing note on heap layout is that, if we needed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, we do have opportunities for heap grooming. Aside from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker controlled ROM size, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s also some variable length header strings (song title etc.) that get heap allocated. Finally, we note that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 gstreamer code for format detection is very non-trivial and may offer furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r opportunities to control heap state.

What lessons can be learned?
While investigating this exploit, a number of hardening ideas came up. Also, a comparison of Ubuntu vs. Fedora -- even when extended to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest releases -- reveals that Ubuntu is slipping behind Fedora for some exploit mitigations. In no particular order:

  • The attack surface of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Linux desktop does not appear to be under control, or adequately monitored for regression. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of Ubuntu, adding MP3 support also appears to add support for a huge number of obscure and largely unnecessary audio and video decoders. These contribute little to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desktop experience but greatly to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security risk. The relevant gstreamer extra plug-in packages even identify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 additional decoders as “bad” or “ugly” in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 package name. An effort to furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r split cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 decoders into “useful” ones vs. “obscure / risky” ones is recommended.
  • Initial signs show that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security quality of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 gstreamer code is behind cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ffmpeg code. One of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reasons for this is likely to be j00ru’s / Google’s significant effort put into improving ffmpeg security: FFmpeg and a thousand fixes. Still, an important question for discussion is whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r gstreamer’s decoders should be replaced with an ffmpeg based backend.
  • Ubuntu is not nearly as thorough as Fedora in using ASLR on binaries. Comparing Ubuntu 16.04 vs. Fedora 24, we see that Fedora has ASLR on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 binaries for totem, rhythmbox and gst-launch-1.0. Ubuntu only has ASLR on totem.
  • Fedora appears to make good use of RELRO whereas Ubuntu does not. RELRO prevents messing with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function pointers in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GOT.
  • The level of sandboxing is disappointing across both Ubuntu and Fedora. Parsing media files in C has always been a hot spot for security and one mitigation is sandboxing. I don’t see much across Fedora or Ubuntu to use SELinux or AppArmor to meaningfully sandbox totem, rhythmbox, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thumbnailing processes, etc. by default. There does appear to be interest, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 urgency does not seem to be high. One useful source: AppArmor Confinement. There’s also this Ubuntu bug to sandbox all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thumbnailers, open since 2011: gnome thumbnailers should have an apparmor profile.
  • Changes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Linux glibc heap management code have increased certain aspects of heap layout determinism, particularly for threaded programs. This is a topic for furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r exploration in a different blog post.
  • 6502 really is fun.

Closing notes
There’s a critical reason that decent, reliable exploitation was possible with this bug: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presence of some form of “scripting” language. In this case, that script happens to be 6502 opcodes. Having an exploit running in script enables important exploitation aspects, such as making decisions based on exploitation environment, and in particular, using code to observe cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 effects of a corruption (such as a memory leak) and make sensible follow-up decisions.

One of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reasons that browsers and browser plug-ins (Flash, Java) are popular exploitation targets is precisely because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are fundamentally scripting environments.

Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r great example of this phenomena is Windows font parsing and rendering. This has traditionally occurred in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel(!!) and rending modern fonts involves…. yes, running a little language to make rendering decisions. Well, many times, attackers have used that same language to cause Windows kernel corruptions and proceed to full ring 0 compromise by using a script-inside-font to make decisions about reliably proceeding with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit.


So watch out for scripting in unexpected places!

17 comments:

Kurt Seifried said...

Can you please request a CVE for this so it's easier to track? Thanks.

eekee said...

I'm a fan of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 6502, I'm very tired of Linux, and I never much liked desktops in general, so learning about this bug was fun! One thing though: gstreamer's "bad" and "ugly" packages don't merely include rare codecs. The last time I looked at gstreamer at all, http functionality -- for streaming media -- was in "bad", if I remember right. Might have been "ugly". I was a bit shocked at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time, thinking "don't cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se people care?" I had to install it, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game I was trying to build needed gstreamer's http functionality for its in-game radio, and live music events over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 in-game radio was one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 primary reasons I played it.

Andy said...

Kurt why don't you do it?

Orion Blastar said...

This is interesting in using emulators to exploit software in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Host OS using code for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 machine being emulated.

It reminded me of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploits in virtual machines to affect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Host OS using codes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 virtual machine.

Anonymous said...

Don't write "an 0day", write "a 0day". 'An ohday' vs 'A zeroday'...

Anonymous said...

The "ugly" naming convention for gstreamer plugins is related to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir legal status (i.e. may be under a patent or similar), racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than reflecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 quality of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code. See https://askubuntu.com/questions/468875/plugins-ugly-and-bad for details.

Sam said...

Install Gentoo!

Anonymous said...

Kudos. I always wondered why we wait to publish stuff like this. 1-day turnaround for Debian Jessie. Not bad!

meta889 said...

@eskee: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "bad" package also includes new codecs. "bad" is like a staging area for new stuff. Once it has been cleaned up and shown to be useful and working well, it is moved eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r to -base, -good, or -ugly (ugly is for reviewed plugins which touch patent/royalty-encumbered stuff like MP3 decoders, -good for those would such issues, and -base for baseline functionality and codecs).

The main HTTP receiver is *not* in bad, it is in good. You probably referred to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Neon-based HTTP source element. The main source element is based on libsoup, called souphttpsrc, and is located in -good.

Also, keep in mind that 0.10 is abandoned. Has been for years. 1.0 is its successor. I would consider using 0.10 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se days a security vulnerability in itself. Switch to 1.0.

baisoku said...

As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author of this particular emulation code, i find this simultaneously amazing and saddening.

(I did not know about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 particular library, however.)

Kurt Seifried said...

I don't know if he's requested one or not, would like to avoid duplicates.

Anonymous said...

I can't trigger this on Ubuntu 12.04.5, no updates, but with mp3-support selected during install. I has been fixed somehow?

Anonymous said...

tails includes lots of gstreamer 0.1 for precisely this reason.

Anonymous said...

I learned 6502 assembly at age 15, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n 40 years passed without using it, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n I read this article today. Never thought I'd see that stuff again! Thanks Chris.

servecom said...

This is an interesting emulator.

Unknown said...

Very nice. Learned cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 craft on a commodore 64, basic first, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n assembly... now, 31 years later, memories coming back :-)

Scrascom said...

This article made me recall how long time ago I had my very first encounters with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se systems. These machines were simpler than today's smartwatches but coding was fun.