[e-lang] Notes from latest Joe-E meeting

Tyler Close tyler.close at gmail.com
Sat Apr 28 11:39:34 EDT 2007


I just uploaded v0.21 of the ref_send distribution which includes a
Joe-E distribution that I think reflects all the Joe-E library
decisions we made in this last meeting. The download is at:

http://waterken.sourceforge.net/download.html

The javadoc is at:

http://waterken.sourceforge.net/javadoc/

Tyler

On 4/26/07, Mark Miller <erights at gmail.com> wrote:
> Forwarded by permission
>
> ---------- Forwarded message ----------
> From: David Wagner
> Date: Apr 24, 2007 5:35 PM
> Subject: Re: Can we meet to discuss Joe-E this week?
> To: Mark Miller, Adrian Mettler, David Wagner, Tyler Close, Marc
> Stiegler, Ka-Ping Yee
>
>
> Here are notes from our meeting today.
>
>
> We all have to think about how to handle Errors due to
> out-of-stack-memory conditions and the security holes associated
> with try-finally, VirtualMachineExceptions, and JoeE.abort().
>
> TODO:
> - Check that primitive arrays are honorarily Equatable (they should be).
>   Check that the spec states this.
> - Change ConstArray and subclasses to avoid using Arrays.equals()
> - Remember that taming database must prohibit use of Arrays.equals(),
>   since it exposes == to callers even if the type of the elements are
>   Selfless
> - Change ConstArray.toArray() to pass in an array and use the runtime
>   type of the array passed to that method, not the runtime type of the
>   'arr' instance field of ConstArray.  i.e., the signature is
>     public <T> T[] toArray(T[] result);
>   After this change, ConstArray instances do not have any notion of an
>   element type (statically, they have an alleged element type E, but
>   clients cannot count on it being correct; dynamically, the implementation
>   has an element types, but it isn't exposed, so clients cannot see any
>   notion of an element type).
> - Add parameter-less toArray() method to ByteArray, BooleanArray, etc.
> - Deflection.allowed(): document that this is intended to allow you
>   to dynamically invoke only the public subset of what Joe-E code can
>   statically call.
> - charset: Change "throw new UndeclaredThrowableException" to throw
>   some kind of Error.
> - charset.UTF8: Adrian might move the escape() and unescape() methods
>   into a different class under charset.
> - NoSuchMember should change to NoSuchMemberException
> - Reflection: static fields "statics" and "instance" should be all-caps.
> - Reflection: change name of field() to declaredField().
> - Reflection will be changed: we get rid of field(), fields(), method(),
>   methods(), constructor(), constructors(), and replace them with a thin
>   wrapper around Class.{getField(), getMethod(), getFields(), getMethods()
>   getConstructor(), getConstructors()} -- i.e., using a wrapper that is the
>   minimum necessary for security.  The wrapper only needs to restrict to
>   the publicly-accessible interface, canonicalize return values to
>   ensure determinism, and ensure that reflection is consistent with the
>   taming database and what is imposed upon static Joe-E code.
> - There is an attack with try-finally and VirtualMachineError.
>      try {
>         ... X ...
>      } catch (final Error reason) {
>        throw JoeE.abort(reason);
>      } finally {
>         ... Y ...
>      }
>   The risk is that if an Error gets thrown when we're out of stack
>   space, then the call to JoeE.abort() might fail and might cause the
>   VM to throw a VirtualMachineError.  At that point the finally-clause
>   (namely, Y) executes.  This is bad, because it means that Joe-E code
>   (other than the abortion handler) can execute after an Error is thrown.
>   For instance, Y might consume the Error and return some value or
>   throw some exception.
>   Attack #1: This can give access to non-determinism. e.g.,
>   something like
>      int f(int i) {
>         try {
>             f(i+1);
>         } catch (final Error reason) {
>             throw JoeE.abort(reason);
>         } finally {
>             return i;
>         }
>      }
>   Impact: pure Joe-E code can get access to non-determinism.
>   Attack #2: This can be used to attack other objects in the same
>   address space and violate their object invariants.
>     public class Victim {
>         private int i=0, j=0; // invariant: i==j
>         public void increment() {
>             i++;
>             call_something_trusted();
>             j++;
>         }
>     }
>     public class Attacker {
>         void attack(Victim v) {
>             char ignored = new char[1<<30]; // allocate lots of memory
>             try {
>                 while (true)
>                     v.increment();
>             } catch (final Error reason) {
>                 throw JoeE.abort(reason);
>             } finally {
>                 .. do something more with v ..
>                 return;
>             }
>         }
>         // Note: when attack() returns, v's invariant is no longer valid,
>         // and the Error has been consumed, and some more Joe-E code might
>         // now be able to exploit a vulnerability in Victim.
>     }
> - Ensure that Joe-E verifier guarantees that if all constructors of
>   a Java class are tamed away, then it is impossible to subclass that
>   class.  For example, double-check that the Joe-E verifier does the
>   right thing with default constructors (which implicitly calls the
>   superclass constructor) and default calls to the superclass
>   constructor (which implicitly call the superclass constructor).
> - Filesystem should document internally that it is relying upon the
>   assumption that the taming database has tamed away all constructors
>   on File (and any subclasses).
> - If we introduce an Unimplementable marker interface, we might want
>   to make File be honorarily Unimplementable.
> - Group had no objection to Adrian adding a delete() method to Filesystem,
>   if he wants and if this does not delay release of Joe-E 1.0 library, but
>   Adrian will have to test on Windows (and think carefully) to check for
>   CON, PRN, PRN.TXT, and similar special filenames.
> - File.list() should return ConstArray<File>, not File[].  In general
>   Joe-E library should be consistent about using ConstArrays rather than
>   primitive arrays, except for varargs or for where we have a good reason
>   to use primitive arrays.
> - Consensus: We continue to allow Object.getClass() in the taming
>   database (no change).
> - We need to prevent Joe-E code from implementing finalize().
>
>
> We did not get around to discussing:
> - org.joe_e.Filesystem
> - How to think about the boundary between Joe-E and Java (e.g., powerboxes)
> - "Unimplementable" marker interface, which no Joe-E code can implement
>   (verifier rejects any attempt to implement it)
> - Reflective access to tamed Java APIs (ensuring that reflection
>   can't be used to bypass taming decisions)
> - "The Deep"
> - Sash powerbox for Joe-E
> - Equality
> - Joe-E security review
>
>
> --
> Text by me above is hereby placed in the public domain
>
>     Cheers,
>     --MarkM
> _______________________________________________
> e-lang mailing list
> e-lang at mail.eros-os.org
> http://www.eros-os.org/mailman/listinfo/e-lang
>


-- 
The web-calculus is the union of REST and capability-based security:
http://www.waterken.com/dev/Web/

Name your trusted sites to distinguish them from phishing sites.
https://addons.mozilla.org/firefox/957/


More information about the e-lang mailing list