[e-lang] Trojan objects?
Kevin Reid
kpreid at attglobal.net
Mon May 30 08:58:58 EDT 2005
On May 28, 2005, at 16:57, Andreas Raab wrote:
>>> So the question is: How does one prevent attacks like these? Are
>>> there any general patterns to avoid this issue?
>> In E, the usual solution would be to require the file pattern object
>> to be DeepFrozen. The E runtime ensures that the object's behavior is
>> consistent with the source code presented to its Auditors
>> (DeepFrozen, in this case).
>
> Interesting. Is there any concise description of the DeepFrozen
> auditor? What it means, when it is applicable etc? I was googling
> over erights.org but not much interesting to find there.
<http://www.erights.org/elang/kernel/auditors/> says, "deep frozen: the
object cannot ever cause the mutation of anything".
An object passing the DeepFrozen guard will act as if it has no access
to mutable state. Therefore it will always react the same to similar
inputs. [1]
This constraint prevents the kind of 'leak' you asked about because
anything which can act on being sent the filename information is by
definition not DeepFrozen.
On DeepFrozen as in my E implementation:
As a guard, it passes any object meeting any of these conditions:
* is primitively declared to be DeepFrozen ("rubber-stamping")
* is Selfless and has only DeepFrozen components
* has passed an immediate-DeepFrozen audit (see below)
* has passed an eventually-DeepFrozen audit and has only DeepFrozen
components
As an auditor, it approves any object which contains only references to
DeepFrozen objects - this is what I call immediate-DeepFrozen.
However, in some cases (mutual-recursive reference) an object intended
to be DeepFrozen is not, at the time of audit, because it contains
promises. Promises can resolve to any value, so I created another
mechanism (not part of official E) called eventually-DeepFrozen.
This allows an object to pass the DeepFrozen guard by revealing its
state to the guard to be inspected for containing only DeepFrozen
components, similarly to how Selfless objects are checked. Such objects
use a sealer/unsealer pair to avoid revealing the state to clients
other than the DeepFrozen guard.
[1] This is not quite equivalent to "the object is a pure function":
DeepFrozen objects can and often do return new Selfish objects, which
(as I understand functional concepts) breaks referential transparency.
True Functional would require the additional constraint that the return
value meets this condition R: is either a *preexisting* Selfish object
or a Selfless object containing only Rs. This is much harder to check.
>> A slightly less restrictive condition would be for the powerbox to
>> get the file pattern by invoking a DeepFrozen object given to the
>> powerbox. The file pattern is then confined: it has no authority to
>> communicate to anything besides its creator, which in this case is
>> (ignoring some indirection) the powerbox.
>
> Thanks! This is all very interesting. I would appreciate if you could
> say a bit more about DeepFrozen implications
I hope the above is useful.
> and whether there are alternative patterns to avoid such trojan
> objects (I'm just trying to see if there are any other "interesting
> alternatives").
Nothing comes to mind. DeepFrozen is, as far as I know, exactly The
Right Thing for this purpose.
--
Kevin Reid <http://homepage.mac.com/kpreid/>
More information about the e-lang
mailing list