making of - dfkiobradovic/publications/cosair-yapc.pdf · module usage summary modules with denied...

61
Making of cosair.org Darko Obradovic [email protected]

Upload: others

Post on 10-Oct-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Making of

cosair.org

Darko [email protected]

Page 2: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Complex● Strategy● AI● Research & Education

Page 3: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

What is the State of the Art?

Page 4: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Board Game AI

Page 5: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Computer Game AI

Page 6: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

What exactly is “complex”?

Page 7: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Complexity Criteria

● more than 2 players● hidden Information● large number of turns or real-time● simultaneous hidden moves● large situation space● complex decision space● randomness

Page 8: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

How to develop AIfor complex games?

Page 9: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Available Software

● commercial games– no programming access– short lifecycle

● open-source games– e.g. “Freeciv”– usually way too complex– no specific AI support

Page 10: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Create your own!

Page 11: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Requirements

● easy debugging & testing● performance evaluation

➔ simulation of multiple games

● comparison to competitors➔ requires a central website or server

● availability of AI modules● game records for analyses

➔ required for most learning techniques

Page 12: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

The CoSAIR Approach

● based on existing browser-game➔ balanced game, mature code

● using mod_perl web server● people can upload, execute, test,

benchmark and compare their bots● access to all CPAN AI::* modules

Page 13: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

What is the game about?

Page 14: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Nations

Page 15: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Planets

Page 16: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Battles

Page 17: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Battles

Page 18: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Battles

Page 19: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Battles

Page 20: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Battles

Page 21: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

How to develop AI for COSAIR?

Page 22: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

AI Architecture

Page 23: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

A bot is a Perl classwith methods for each decision

Page 24: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Example Bot Code

● package Cosair::AI::Bot::BrainBug;

use base ('Cosair::AI::Bot');require Cosair::AI::OwnPlanet;

# called whenever queue runs emptysub decide_planet_items {

my ($self, $planet) = @_;if ($planet->can_build('starbase')) {

return 'starbase';} else {

return 'cruiser';}

}

Page 25: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

This is executed each turnby the game engine

Page 26: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Bot Execution Code I

● # create a sandbox copy of the game statemy $control = create_control($bot_name);

$db->begin_work();

eval {my $bot = Cosair::AI::Bot->new($control);

# operate exclusively on $control$bot->calculate_turn();

# check actions and write to databaseprocess_actions($control);

}

Page 27: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Bot Execution Code II

● if ($@) {# error in bot code or illegal action$db->rollback();log_error($bot_name, $@);

} else {# everything ok, commit actions$db->commit();

}

# log debug messages in any caselog_debug_messages($control);

Page 28: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Letting people execute codeon my server???

Page 29: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required
Page 30: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Code Monitoring

● monitor code in regular intervals to avoid– infinite loops– memory leaks

● consider:– process time, not real time– process might grab several MB/s

Page 31: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Code Monitoring Code I

● use Time::HiRes qw(setitimer ITIMER_VIRTUAL);use Devel::Mallinfo qw(mallinfo);

my $seconds_running = 0;my $memory_offset = mallinfo()->{uordblks};

# return allocated memory in MBsub allocated_memory {

return(mallinfo()->{uordblks} - $memory_offset)/ (1024*1024);

}

Page 32: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Code Monitoring Code II

● local $SIG{VTALRM} = sub {# infinite loop check$seconds_running += 1;die "exceeded time limit of 10s!\n"

if ($seconds_running >= 10);

# memory leak check, use MB as unitdie "exceeded memory limit of 64MB!\n"

if (allocated_memory() > 64);};

Page 33: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Code Monitoring Code III

● # check each second of process timesetitimer(ITIMER_VIRTUAL, 1.0, 1.0);

# execute monitored bot codeeval $bot_code;

# stop checkssetitimer(ITIMER_VIRTUAL, 0);

if ($@) {# handle exceptions

}

Page 34: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required
Page 35: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Code Restrictions

● prevent execution of malicious code:– game information spying– game data manipulation– filesystem access– uncontrolled module usage

Page 36: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

use Safe;

Page 37: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Opcode Restrictions

● control compiler-internal Perl opcodes➔ perldoc Opcode

● in our scenario:– allow basic perl constructs– allow “require”, “bless”, references...– deny any I/O– deny all system interactions

Page 38: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Safe Compartments I

● sub get_safe {my $safe = Safe->new('Cosair::AI');$safe->permit_only(qw(

:base_core :base_mem :base_loop:base_math :base_orig require

));$safe->deny(qw(

entertry leavetrydbmopen dbmclose

));return $safe;

}

Page 39: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Safe Compartments II

● my $safe = get_safe();# only non-lexical variables can be sharedour $result;$safe->share('$result');

$safe->reval(q[# only restricted opcodes compile$result = 42;

]);die “error in safe: $@” if ($@);

print $result, “\n”;

Page 40: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

This is easy for simple code.How about using modules?

Page 41: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required
Page 42: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Safes & Modules

● A “require” in a safe– always refers to the ”main” namespace– always compiles the module

● including all of its dependencies● with the opcode restrictions

➔ bypasses the namespace limitation!

Page 43: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Module Usage Summary

● modules with denied opcodes (case 1)– have to be required outside the safe– must not be required in the safe– thus have to be in the safe's namespace– have to be used in the safe without the

namespace prefix

● modules without denied opcodes (case 2)– can be required in the safe– can be used with their full namespace

Page 44: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Importing Functions I

● importing functions inside the safe:–

use Namespace::Module qw(sub_a sub_b);

$safe = Safe->new('Namespace');$safe->reval(q[

# module is compiled and accessible# but subs are not yet importedModule->import('sub_a', 'sub_b');

]);

➔ does not work without changes

Page 45: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Importing Functions II

● reason: @ISA is evaluated at runtime and Exporter::import() is not visible–

package Namespace::Module;

use Exporter qw(import);our @EXPORT_OK = qw(sub_a sub_b);

➔ importing in the safe works now!

Page 46: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

That was easy.- Too easy?

Page 47: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Inheritance

● runtime evaluation of @ISA makes inheritance very messy

➔ each class in the inheritance tree has to be modified for usage in the safe➔

Page 48: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Inheritance Code

➔ require Namespace::BaseClass;require Namespace::DerivedClass;

$safe->reval(q[my $object = DerivedClass->new();# adapt @ISA locally# relative to safe's namespacelocal @DerivedClass::ISA = qw(BaseClass);# now inherited methods can be called...

]);

➔ has to be done recursively!

Page 49: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

External Classes I

● good news:– references blessed outside the safe can be

used in the safe when shared

● bad news:– inheritance does not work of course

● even worse news:– @ISA cannot be adapted, it's out of scope!

● worst news of all:– most classes I need use inheritance

Page 50: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

External Classes II

● possible solution:

1. derive the class in question

2. make the new class be an exporter

3. export all class and object methods

4. write a new wrapper class in the safe's namespace

5. import all methods from the derived class

6. hope that it works for your module...

Page 51: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

And you use it exactly like this?

Page 52: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Practical Problem

● the safe is inefficient for trusted bots● situation: evaluate an untrusted bot

– playing a series of 500 games– with 500 turns in average– with 5 trusted bots as opponents– 1,500,000 safe executions

● the safe prohibits the use of some external classes

Page 53: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Practical Solution

● source code transformation on upload:– strip namespace prefix everywhere– replace “use” with import calls– remove “require” lines

➔ people can code as if there was no safe➔ bots can be executed

➔ in safe (with transformation)➔ outside safe (without transformation) and use

all desired modules

Page 54: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

That was it?Ready, set, go?

Page 55: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Open Problems

● Security risks:– some crashable opcodes still allowed

(sprintf, sort, ...)– instant memory mass-allocation still possible

● module usage restrictions(needs wrapping in safe's namespace)

● SQLite commands abusable(filesystem access)

Page 56: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Wishlist

● Safe with monitoring capabilities• $compartment->set_time_limit(10.0)• $compartment->set_memory_limit(64.0)

● Safe with more differentiated namespace visibility

Page 57: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

What else?

Page 58: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Simulations

● schedule simulation runs– with defined priority

● daemon processes calculate individual games– uses nice– multi-processor capable

Page 59: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Other Languages

● OO architecture allows any classes with the specified methods to act as a bot

➔ use Inline;– Safe compatibility?– inheritance problems?– external modules inaccessible

➔ only suitable for simple bots in education

Page 60: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

Graphics from:

● http://www.rabittooth.com/● http://www.wallpapersweb.com/● http://www.3dworldclub.com/● http://www.imageshack.us/● http://www.luckycastles.co.uk/● http://www.st-v-sw.net/●

Page 61: Making of - DFKIobradovic/publications/cosair-yapc.pdf · Module Usage Summary modules with denied opcodes (case 1) – have to be required outside the safe – must not be required

The End

Thank you!Any questions?