Checkpoint/restore of capabilities
Denis Huber
huber.denis at ...435...
Sat Oct 22 13:18:39 CEST 2016
Hello Norman,
thank you for the confirmation of my thoughts and for the
correction/clarification of my misunderstandings.
> This won't work that easily. The AVL tree contains pointers that point
> to some place within the target's address space. A function call would
> ultimately de-reference those pointers. If you attach (a part of) the
> target's address space within the monitor's address space, the pointers
> would generally not be valid in the monitor's address space. Aside from
> that, I do not think that it would be a good idea to let the monitor
> de-reference pointer values originating from the (untrusted) target.
>
> The AVL tree must be manipulated without relying on the original code.
> To sidestep this issue, I proposed to simplify the data structure, e.g.,
> by replacing the AVL tree by a list. Then, the monitor just needs to
> write new badge values into the targets memory but won't need to
> manipulate the target's data structures. This applies to the AVL tree
> used in the cap map and the AVL tree used by the object pool (which also
> uses the badge as key).
Thank you for the hint with the pointers inside an AVL tree. I did not
thought my concept to the end and missed the fact, that the pointers are
only valid inside target's address space. Thus, I will simplify the AVL
tree for the cap map and the AVL tree of the object pool to lists. And
just change the values of the list elements. I will still need to use
the pointer of List::Element::_next, but I will have to convert the
pointer to point to a dataspace of the target.
> No. But my suggestion of the PD-session extension was not concerned with
> capability maps at all. The proposed mechanism would only operate on the
> target's capability space. The capability map must by adjusted by the
> monitor by manipulating the target's memory. Both pieces of the puzzle
> are needed: the population of the target's cap space (via an interface
> provided by core), and the update of the badges in the target's cap map.
Now I understand. You mean, I can propagate information from the target
component through its capability space. For a simple example, I could
create an (unbound) IPC gate, store a pointer into the label, and use a
capability space slot to reference it. I could take one from the area
controlled by core, which will (probably) not be overriden: I could take
the last one which is 0x1ff.
> By "could happen internally in the base library", I meant that the
> proactive "leaking" of interesting information (like the base address of
> the cap map, or the association between kcap selectors and badges) from
> the target to the monitor could be hidden in the base library (which is
> locally linked to each component). Because it would not be visible at
> the API level, it is transparent to component developers.
I could do the creation of the IPC gate and the assignment in the
startup code of the application. I found a file, where a function
initializes the main thread:
base_foc/src/lib/base/thread_bootstrap.cc:30
It is called prepare_init_main_thread. Is it save to use this function,
or is there a better one?
What do you think about my approach? Will it work theoretically with the
assumption that the last capability slot will not be used by any
Genode/Fiasco.OC library and by no future library/component.
Kind regards,
Denis
More information about the users
mailing list