Saturday, September 27, 2014

Exile for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BBC Micro; some elegant solutions

[Prelude: sorry, this has nothing to do with security whatsoever. Feel free to bail now if you're not interested in a classic 1980's game, and rest assured that non-security posts to this blog will remain extremely rare.]

The BBC Micro game Exile, released in 1988, has a realistic claim for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best game ever. I lost months of my youth to this game. I also lost a fair few days recently re-playing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game under emulation in 2014!

What cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 authors were able to do with just 32KB (for everything, including video RAM) was amazing. The art of coding in this way has simply been lost. The game features:

  • An enormous map featuring fairly open-ended exploration.
  • A full physics engine (gravity, momentum, conservation of momentum, buoyancy, friction).
  • Dozens of fiendish puzzles, characters and objects, with many interactions between entities.
There's even a great disassembly online. I was quite surprised to see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game really is powered by real 6502 opcodes, and not unicorn tears.

The claim for "best game ever" isn't just about packing so much into such a small resource. Completing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game, even if you know what you're doing, is hours of immersive play that alternates between solving very varied puzzles and arcade-like blowing stuff up. Given how free-form cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game is, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are also different solutions and orderings to to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game, so you can put your own personal spin on things.

If you want to see what all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuss is about, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best emulator is probably B-em (part of a webring, remember those??) and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Exile game image can be readily found. And do feel free to stop reading to avoid cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 spoilers that now follow.

There seem to be two solutions published on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 web. Unfortunately, both have triggered my OCD. Both have solutions for some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more interesting problems that rely on abusing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 limits and corner cases of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game engine, such as:
  • Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 built-in viewport scrolling to sneak around with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 viewport scrolled to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extreme so that an enemy or obstacle does not "see" cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 player.
  • Abusing 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 physics engine "forgets" objects that are offscreen, causing corner-case and clearly unintentional behavior. (Give cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 poor game a break, it's trying to fit everything into 32KB!)
  • Proposing solutions with low reliability.
More significantly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se problems have such beautifully elegant solutions that once you see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, it's clear that you've worked out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 authors' original intent. So without furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r ado, here is a small collection of videos that illustrates some elegant solutions as well as an easter egg:

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


The game features a tricky-to-get alien weapon! In fact you can get it from two different places. Generally, you can feed different types of imps different "gifts" 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ý bet365y might later throw you a gift in return. In this video, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se cyan imps will accept a blue mushroom. Later in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game, dark blue imps accept piranhas. I had found this later exchange, but this earlier exchange was a complete surprise to me -- I only noticed it reading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 disassembly referenced above.
It's a real boon to get such a powerful weapon earlier in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game. It never runs out of energy and it has good destructive power for some obstacles that are ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise annoying. Just watch out you don't burn yourself and that you don't blow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 weapon up, it's destructible.

Getting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first coronium rocks out of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 alcove


There's no need to try and force cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rock past cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 blowing bush. Speedy throwing and viewport scrolling are not necessary. There's a simple, elegant sequence that will rescue it reliably and without dubiousness.

Blowing open cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rune door

The first two-thirds or so of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game are building up towards opening a very important door into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bad guy's lair. This door is blown open with a nuclear explosion between two radioactive rocks. Given cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 importance of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 door, it's not surprising that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 final puzzles towards opening it have beautiful solutions.
Both published solutions transport radioactive rocks via a route that is clearly not supposed to be an option, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 route only works on account of abusing game engine quirks. Tut tut! Here's a less hacky way of getting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 required rocks, in three parts:




There's a lot going on here:
  • In part #1, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 use of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 maggot to "wake up" cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 nest of green slimes is fun. Note that this doesn't always work! Game design bug? This is a very busy area of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 map and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game engine often decides cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's too much on-screen to spawn creatures from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 nest. I lost a day stepping through 6502 assembler to understand this.
  • Then, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 green slimes appear attracted to sound. So we made some noise!
  • The use of buoyancy to avoid cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sucking bush is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first and only significant usage in a puzzle. Wonderful.
  • In part #2 and #3, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presence of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 big fish prevents cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 (very dangerous) piranhas from coming out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 nest and ruining your day.
  • In part #3, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 piranha is actually immune to damage from acid drops -- I believe cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only creature in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game that has this trait. (You can even check cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 disassembly :-)
Getting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mushroom immunity pill

Again, this puzzle involves blowing a door open with radioactive rocks. The published solutions suggest all sorts of hacks here, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a really neat solution with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "blaster" weapon that has been recently collected at this stage in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game. Previous weapons were projectile based but this one is force based and it can be used variously: at a distance to gently deviate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 course of an acid drop, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n at close range to reliably launch a rock past a problem area.


Happy exploring.

Thursday, September 25, 2014

Using ASAN as a protection

AddressSanitizer, or ASAN, is an excellent tool for detecting subtle memory errors at runtime in C / C++ programs. It is now a productionized option in both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 clang and gcc compilers, and has assisted in uncovering literally thousands of security bugs.

ASAN works by instrumenting compiled code with careful detections for runtime errors. It is primarily a detection tool. But what if we attempted to use is as a tool for protection?

The case for using ASAN-compiled software as a protection is an interesting one. Some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most severe vulnerabilities are memory corruptions used to completely compromise a victim's machine. This is particularly cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case for a web browser. If an ASAN-compiled build can help defend against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se bugs, perhaps it has value to some users? An ASAN build is slower enough that no production software is likely to ship compiled with ASAN. But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 slow down is not so bad that a particularly paranoid user wouldn't be able to easily accept it on a fast machine.

With that trade-off in mind, let's explore: does ASAN actually provide protection? To answer that, let's break memory corruption down into common vulnerability classes:

1. Linear buffer overflow (heap, stack, BSS, etc.)
A linear buffer overflow is one where every byte past cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of a buffer is written in sequence, up to some end point (example). For example, a memcpy() or strcpy() based overflow is linear. Because of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way ASAN works, I believe it will always catch a linear buffer overflow. It uses a default "redzone" of at least 16 bytes, i.e. touching _any_ address within 16 bytes of a valid buffer will halt cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program with an error. Under ASAN, a linear buffer overflow condition will always hit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 redzone.
This is great news because linear buffer overflows are one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more common types of security bugs, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are quite serious, affording cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker a lot of control in corrupting program state.

2. Non-linear buffer overflow
A non-linear buffer overflow is one where data is written at some specific (but often attacker-controlled) out-of-bounds offset relative to a buffer (example). These bugs can be extremely powerful. Unfortunately, because of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir power, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are both favored by attackers and also not stopped by ASAN if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker knows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are targeting an ASAN build. Example C program:

int main()
{
  char* p = malloc(16);
  char* p2 = malloc(16);
  printf("p, p2: %p, %p\n", p, p2);
  p2[31] = '\0';
}

Compile it with ASAN (clang -fsanitize=address) and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n run it and no error will be detected. The bad dereference "jumps over" cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 redzone to corrupt p2 via pointer p.

3. Use-after-free / double-free
ASAN does detect use-after-frees very reliably in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 conditions that matter for current use cases: normal usage, and under fuzzing. However, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker is specifically targeting an exploit against an ASAN build, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can pull tricks to still attempt cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit. By churning cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory allocator hard (as is trivially possible with JavaScript), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 condition can be hidden. Example C program:

int main()
{
   int n = 257 * 1024 * 1024;
   char* p2;
   char* p = malloc(1024);
   printf("p: %p\n", p);
   free(p);
   while (n) {
     p2 = malloc(1024);
     if (p2 == p) printf("reused!!\n");
     free(p2);
     n -= 1024;
   }
   n = 30 * 1024 * 1024;
   while (n) {
     p2 = malloc(1024);
     if (p2 == p) printf("reused!!\n");
     n -= 1024;
   }
   p[0] = 'A';
}

The bad reference is not trapped with default ASAN values. The default values can be changed such that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bad reference is trapped:

ASAN_OPTIONS=quarantine_size=4294967295 ./a.out

It's a shame that setting this value to "unlimited" may not be possible due to a probable integer truncation in parameter parsing, see how this behaves differently:

ASAN_OPTIONS=quarantine_size=4294967296 ./a.out

4. Uninitialized value
Uninitialized values are harder to categorize. The impact varies drastically depending on where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 uninitialized value is a pointer or an integer. For example, for an uninitialized pointer, effects similar to "non-linear buffer overflow" might even apply. Or if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 uninitialized value is a copy length cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n perhaps it's more similar to "linear buffer overflow".
Or, if it's an uninitialized raw function pointer, that's a bigger problem. Indirect jumps are not checked. The behavior of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following ASAN-compiled program is instructive (run it in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 debugger):

void subfunc1()
{
  unsigned long long blah = 0x0000414141414141ull;
}

void subfunc2()
{
  int (*funcptr)(void);
  funcptr();
}

int main()
{
  subfunc1();
  subfunc2();
}

If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 uninitialized value is a pointer to a C++ class cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n similar (indirect) problems apply.

5. Bad cast
The effects of a bad cast are fairly varied! Perhaps cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bad cast involves mistakenly using an integer value as a pointer. In this instance, effects similar to "non-linear buffer overflow" might be achievable. Or perhaps if a pointer for a C++ object is expected, but it is mistaken with a pointer to a raw buffer, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n a bad vtable gets used, leading to program flow subversion. One final C++ example to illustrate this. Run under ASAN to observe a raw crash trying to read a vtable entry from 0x0000414141414141:

class A
{
public:
  long long val;
};

class B
{
public:
  virtual void vfunc() {};
};

int main()
{
  class A a;
  a.val = 0x0000414141414141ull;
  class B* pb = (class B*) &a;
  pb->vfunc();
}


Safer ASAN?
There's certainly scope for a safer variant of ASAN, specifically designed to provide safety racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than detection. It would be based on various changes:

  • Change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dereference check from "is this dereference address ok?" to "is this address in bounds for this specific pointer?". This takes care of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 nasty "non-linear buffer overflow" as well as some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 worst effects of bad casts. This is not an easy change.
  • Initialize more variables: pointer values on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack and heap. (This is not as easy as it sounds, particularly for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap case, where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 casting operator may become a point of action.)
  • Make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 quarantine size for use-after-free unlimited. This burns a lot of memory, of course, but may be acceptable if fully unused pages are returned to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system with madvise() or even a crazy remap_file_pages() trick.


Remaining risks

Of course, even a "safer ASAN" build would not be bullet-proof. Taking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specific case of an safer-ASAN compiled Chromium, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re would still be additional attacks possible:

  • Plug-ins. Many plug-ins are closed source and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore cannot be replaced with ASANified versions. The safer build of Chromium would have plug-ins disabled: --disable-plugins or even at compile time.
  • Native attack surfaces called by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser. For example, what happens when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser encounters a web font. It'll probably get passed to a system library which parses this dangerous format using native code. In extreme cases, such as older Chromium on Windows, fonts were parsed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel(!). --disable-remote-fonts, probably ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r flags.
  • Native attack surfaces triggerable by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser. Less obviously, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re can be operating system mechanisms that kick in simply because a file is downloaded or appears on disk. Anti-virus is notoriously buggy in this regard.
  • The v8 JIT engine. Any logic error in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT engine resulting in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 emission of bad opcode sequences, or sequences with buggy bounds checks, are pretty toxic.
  • Pure logic vulnerabilities. UXSS vulnerabilities will remain unmitigated. In extremely rare but spectacular cases, unsandboxed code execute has been achieved without cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 need for memory corruption at all.

That all said, a stock ASAN build -- and even more so a hypocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365tical safer-ASAN build -- provide significant mitigation potential against memory corruption vulnerabilities. One measure of how strong a mitigation is, is whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r is totally closes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 door on a subset of bug classes or bugs. Even for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stock ASAN case, it appears that it does (linear buffer overflows for a start).

There is certainly more room for exploration in this space.