Gernot and all,

No, you have it all right. It's only that I'm frustrated because I cannot
see the implementation of what everyone so offhandedly calls easy.
I can see how to grant R/O access to a part of the user-level address
space, but I don't see how to grant R/O access to a useful address space.
I've asked about it here before, and I spent quite a long time bringing
kernel modules to the virtualized-linux space in an effort to realize this
end.
In my inexperience, I took it personally when I was told what I spent so
long creating was worthless for this effort, but in a lasting way I realize
knowledge has value in its own right.
Hugo is obviously well-experienced and knowledgeable, and I respect his
opinion highly.

I'm sure I will come back with a more appropriately worded question after
going back to the source, or maybe I will surprise you with some amusing
solution.

Sincerely,
Michael Neises


On Tue, Oct 26, 2021 at 12:07 PM Gernot Heiser <ger...@unsw.edu.au> wrote:

> Folks,
>
> I’m not sure what triggered that reaction of Michael’s quoted by Hugo
> below, but it must have been something off-list. Certainly the discussion I
> saw on the list was perfectly polite and constructive, let’s keep it that
> way please.
>
> In terms of the technical issues, I can only agree with Hugo: I fail to
> see how the guest measuring itself can give you any integrity guarantee. If
> you assume the guest to be compromised (and why else would you want to
> measure it) then you have to also assume it to be arbitrarily malicious,
> and thus it could just fake the measurement and return a known “good value”
> that has nothing to do with the correct measurement.
>
> To ensure integrity, the measurement has to be done outside the guest. And
> doing that should not be hard: Have a separate measurement component that
> has R/O access to all of the guest’s address space, and it can perform the
> measurement in a tamper-proof fashion.
>
> Am I missing something?
>
> Gernot
>
> > On 26 Oct 2021, at 05:29, Hugo V.C. <skydive...@gmail.com> wrote:
> >
> > Hi Michael!
> >
> > Adding the full list to the thread again (we missed them at some
> point...).
> >
> > "I appreciate the complete lack of partial credit, and I consider you
> find
> > my work to be a waste."
> >
> > I don't think anyone thinks your work is a waste. Personally, I just gave
> > my opinion about the architecture, but of course the final decision is
> > yours, as it is your baby :)
> >
> > Maybe someone on the list can answer you with a more specific example you
> > require (even if they already gave some hints...).
> >
> > Cheers,
> >
> >
> >
> >
> > El lun, 25 oct 2021 a las 19:11, Michael Neises (<
> neisesmich...@gmail.com>)
> > escribió:
> >
> >> Hugo (and Everyone),
> >>
> >> Thank you for the reminders.
> >>
> >> I believe it's trivial to provide or restrict caps to any IO device. So,
> >> yes, I believe with the board's reference manual it should
> theoretically be
> >> quite easy to restrict them all.
> >>
> >> I appreciate the complete lack of partial credit, and I consider you
> find
> >> my work to be a waste. So with that in mind I'll ask once more:
> >>
> >> Has anyone on the planet ever performed such an independent measurement
> of
> >> a virtual machine, or is seL4 really as unusable as indicated?
> >>
> >> I don't want to spend any amount of time barking up a tree that doesn't
> >> exist.
> >>
> >> Cheers,
> >> Michael Neises
> >>
> >>
> >>
> >>
> >>
> >> On Mon, Oct 25, 2021, 01:02 Hugo V.C. <skydive...@gmail.com> wrote:
> >>
> >>> Hi Michael,
> >>>
> >>> as I commented, it depends on the runtime environment. The scenario I
> >>> described, even if challenging, it is just one of many you could face.
> Let
> >>> me explain myself.
> >>>
> >>> Really, it is irrelevant if the full Linux (or whatever OS) VM is
> >>> "inmutable". At some point you need to load code into memory and run
> it.
> >>> Then, only formal verified code (like seL4) is reasonably secure. Being
> >>> pedant, anything else simply it is not.
> >>> Why?
> >>>
> >>> The reason is you will never be sure what interactions the VM OS (in
> your
> >>> example Linux) will have with the outside World. Do you have NTP
> client...?
> >>> HTTP clients...(wget)? DNS clients...? Are you absolutely sure you know
> >>> every line of this VM OS (Linux) and can guarantee there will be no
> out of
> >>> control interaction with the outside Word?
> >>>
> >>> Let's go a step ahead in the offensive mindset. Even in the case you
> are
> >>> building a siloed "air gap" machine (no networking), do you have full
> >>> awareness of all the I/O mechanisms of the device so you can guarantee
> >>> there will be no interaction with the outside World...?
> >>>
> >>> For that reasons code is formally verified. That is the only way to be
> >>> sure things are reasonably secure.
> >>>
> >>> If we accept the last statement as true, any integrity check done from
> >>> inside of unverified code, is, by definition, not trustable. But of
> course
> >>> you can do it.
> >>>
> >>> On the other side, what I don't get is, if you consider (for whatever
> >>> reason) your guest OS is inmutable... then why you want to check
> integrity
> >>> from inside...?
> >>>
> >>> In embedded World, integrity checks always need something
> (theoretically)
> >>> really inmutable (i.e. CPU fuses). You need to check/anchor from the
> most
> >>> trustable source you have. That's why in embedded devices there are
> those
> >>> "funny" boot sequences with chain of trust where different parts of the
> >>> system (from most simple to most complex) are used to verify the next
> step
> >>> in the boot chain.
> >>>
> >>> Having said that, of course you can do integrity checks from inside the
> >>> VM itself, but IMHO will be a waste of trusted computing power of seL4
> >>> platform.
> >>>
> >>> Please excuse me in advance if I misunderstood your message.
> >>>
> >>> A very interesting topic.
> >>>
> >>> Cheers,
> >>>
> >>>
> >>> El lun., 25 oct. 2021 2:34, Michael Neises <neisesmich...@gmail.com>
> >>> escribió:
> >>>
> >>>> Hugo and Everyone,
> >>>>
> >>>> Thanks for the response. This is something I've worried about as well.
> >>>>
> >>>> I've been under the impression that once I compile a seL4 image, that
> >>>> image should be static no matter how many times I boot it. That is,
> I've
> >>>> looked around for persistent storage to use, and my solution has so
> far
> >>>> been to recompile the entire seL4 image in order to insert new data.
> So
> >>>> even when I "touch" files in the Linux virtual machine, they are
> completely
> >>>> forgotten when I reboot the system. For a time I thought of this as an
> >>>> impediment, but I soon came to realize it as a benefit. So I suppose I
> >>>> should clarify that when I said "Linux kernel" in that quote, I really
> >>>> meant this particular Linux image which is prepared at compile-time
> and
> >>>> virtualized by seL4 at runtime.
> >>>>
> >>>> For the last several months, I've been operating under the assumption
> >>>> that there is no way for me, even as a developer, to "manipulate the
> seL4
> >>>> image I used to boot myself." Namely, I've been trying to jump
> through all
> >>>> these virtual network hoops because I couldn't figure out a way to
> make
> >>>> persistent changes to the image. So, as I said, I had taken it for
> granted
> >>>> that a seL4 image was immutable in this way, but I recognize your
> point
> >>>> that maybe it is not. My argument has been that the seL4 image is
> loaded
> >>>> onto an SD card, and I can forbid access to that SD card, which means
> the
> >>>> image should be guaranteed to be untouchable except maybe by the seL4
> >>>> kernel itself.
> >>>>
> >>>> I believe seL4's proofs uphold my argument regarding "capabilities" to
> >>>> the SD card, but I admit a slim understanding of seL4's "caps." I
> will be
> >>>> happy as always to be edified.
> >>>>
> >>>> Cheers and Good Evening to you,
> >>>> Michael Neises
> >>>>
> >>>> On Sun, Oct 24, 2021 at 4:32 PM Hugo V.C. <skydive...@gmail.com>
> wrote:
> >>>>
> >>>>> Hi Michael,
> >>>>>
> >>>>> "Please correct me if I am wrong, but I think if the very first thing
> >>>>> the Linux kernel does is measure itself, before it is even connected
> >>>>> to a network, then there is simply no attack surface"
> >>>>>
> >>>>> My 5 cents: it is not so simple... it depends on the specfic run time
> >>>>> environment.
> >>>>> Anyway, just as an example, some years ago I was challenged with a
> >>>>> similar scenario: an appliance running Linux firmware with an
> embedded
> >>>>> integrity mechanism in the kernel code that checked its own
> integrity and
> >>>>> also the integrity of all loaded kernel modules (that were doing
> integrity
> >>>>> checks of the file system). Once initial modules were loaded no more
> were
> >>>>> allowed to be loaded.
> >>>>> Anyway, the running kernel was very outdated, so I was able to find a
> >>>>> vulnerability that allowed me to inject my own data/code in the
> kernel
> >>>>> space. The problem was persistence: most of the file system was read
> >>>>> only... with the exception of some config files in the compact flash
> >>>>> storage... a second bug in the parsing of the config files (that
> allowed
> >>>>> user space command execution to trigger the kernel vuln) gave me the
> >>>>> persistence I wanted for my kernel level vulnerability in that
> "inmutable"
> >>>>> system. Game over.
> >>>>>
> >>>>> So, it really depends on your environment. As long you have I/O data
> >>>>> operation were an attacker can interact to some persistent storage,
> then
> >>>>> there's room for persistent intrusion no matter the runtime checks
> you do
> >>>>> on the kernel or the file system. There have been plenty of even more
> >>>>> elaborated attacks/tricks on heavily siloed and isolated and
> "inmutable"
> >>>>> systems that have been carried out in the computing history. In
> fact, those
> >>>>> are the interesting ones... :-)
> >>>>>
> >>>>> Hopes this helps.
> >>>>>
> >>>>>
> >>>>> El dom., 24 oct. 2021 19:46, Michael Neises <neisesmich...@gmail.com
> >
> >>>>> escribió:
> >>>>>
> >>>>>> Hello seL4 developers,
> >>>>>>
> >>>>>> Thank you for the replies.
> >>>>>>
> >>>>>> For the sake of clarity, the system works like this:
> >>>>>> At compile time, some expected digest values are made available only
> >>>>>> to a
> >>>>>> distinct CAmkES component. At the time of first-Linux-boot, a kernel
> >>>>>> module
> >>>>>> takes several measurements of the other kernel modules present
> >>>>>> (including
> >>>>>> itself). It reports these digests outwards to CAmkES, where they are
> >>>>>> compared against the expected values. It is the "pre-compile-time
> >>>>>> provisioning of these expected digests" in which I am interested. At
> >>>>>> this
> >>>>>> time, I can simulate the system and compute these digests, but the
> >>>>>> only way
> >>>>>> I have to extract them is to copy them by hand off the screen. To be
> >>>>>> totally explicit, I want to extract these values in order to
> re-compile
> >>>>>> them into a system that knows its expected digest values. I want to
> >>>>>> have an
> >>>>>> initial simulation where I extract these digests, so that in the
> >>>>>> subsequent compilation and simulations, the system is aware what
> values
> >>>>>> these digests are required to take.
> >>>>>>
> >>>>>> Please correct me if I am wrong, but I think if the very first thing
> >>>>>> the
> >>>>>> Linux kernel does is measure itself, before it is even connected to
> a
> >>>>>> network, then there is simply no attack surface. Of course I'm very
> >>>>>> happy
> >>>>>> to be wrong, but I don't see who the attacker is in this situation.
> >>>>>> Certainly, there remains an open question of how to extend these
> >>>>>> measurements meaningfully into the space where there is a viable
> attack
> >>>>>> surface (after enabling a network adapter), but I consider that
> >>>>>> question to
> >>>>>> be beside the point for now (some future work). If there is some way
> >>>>>> for me
> >>>>>> to inspect the run-time data of the Linux system without relying
> >>>>>> somewhat
> >>>>>> on a tool inside the Linux instance, I would very much like to know
> >>>>>> about
> >>>>>> it. My strategy follows the same path as the vm-introspect example
> app
> >>>>>> (which I'm under the impression was created for this explicit
> purpose),
> >>>>>> which itself trusts implicitly the Linux instance. Again, to be
> >>>>>> entirely
> >>>>>> explicit, there does not appear to be any information anywhere on a
> >>>>>> way to
> >>>>>> meaningfully inspect a virtualized Linux system without trusting it
> >>>>>> even
> >>>>>> the slightest bit. I would be elated to be corrected; if someone can
> >>>>>> show
> >>>>>> me how to scrape (from the seL4 side exclusively) all the bits from
> a
> >>>>>> virtual Linux system and reassemble those bits into
> >>>>>> semantically-valuable
> >>>>>> information, I'm sure you will not hear from me for several months
> >>>>>> while I
> >>>>>> rebuild everything I have. At this time that does not appear to be
> >>>>>> possible.
> >>>>>>
> >>>>>> Cheers,
> >>>>>> Michael Neises
> >>>>>>
> >>>>>> On Tue, Oct 19, 2021 at 3:46 PM Michael Neises <
> >>>>>> neisesmich...@gmail.com>
> >>>>>> wrote:
> >>>>>>
> >>>>>>> Hello seL4 developers,
> >>>>>>>
> >>>>>>> I want to be able to retrieve data from seL4's virtual Linux
> >>>>>> machine, in
> >>>>>>> order to store it in a persistent way. Namely, I want to be able to
> >>>>>>> simulate a seL4 kernel, boot its Linux virtual machine, compute
> some
> >>>>>> hash
> >>>>>>> digests, and then export those hash digests. These digests are
> >>>>>> valuable
> >>>>>>> because they represent the "clean room" runtime-state of the linux
> >>>>>> machine.
> >>>>>>> Currently I can export these digests by way of hand-eye
> >>>>>> coordination, but I
> >>>>>>> consider this unusable as a piece of software.
> >>>>>>>
> >>>>>>> To date I've taken two main approaches: CAmkES FileServer or
> virtual
> >>>>>>> networking. I'm under the impression that the FileServer changes
> are
> >>>>>> not
> >>>>>>> persistent through reboot, and even if they were, to change the
> boot
> >>>>>> image
> >>>>>>> after compile-time would seem to fly in the face of seL4's
> >>>>>> principles.
> >>>>>>> Virtual networking seems to promise I can host my digests on a
> >>>>>> webpage that
> >>>>>>> is visible to my "root host" machine; that is, the simulated seL4's
> >>>>>> linux
> >>>>>>> instance hosts a site available on my 192.168.x.x network. I know
> >>>>>> there is
> >>>>>>> a seL4webserver app as part of the seL4 repositories which claims
> to
> >>>>>> do
> >>>>>>> this, but unfortunately its prose is unhelpful and it doesn't seem
> >>>>>> to work
> >>>>>>> even when it compiles and simulates.
> >>>>>>>
> >>>>>>> I've taken two distinct strategies to investigate the virtual
> network
> >>>>>>> approach. First, I tried to get it to work on my normal stack:
> >>>>>> Windows 10
> >>>>>>> using WSL2 using a Docker container to simulate the seL4 image. The
> >>>>>> problem
> >>>>>>> with this approach is that it appears I'm required to blindly
> thread
> >>>>>> 3 or 4
> >>>>>>> needles all at once, without getting feedback more descriptive than
> >>>>>> "you
> >>>>>>> didn't do it." In other words, there does not appear to be a
> partial
> >>>>>>> success available, and without ICMP ping, I honestly have no idea
> >>>>>> how to
> >>>>>>> debug these "virtual" networks.
> >>>>>>>
> >>>>>>> Next, I tried simplifying my stack by installing the dependencies
> >>>>>> natively
> >>>>>>> on a Debian 10 machine, which should bypass several layers of the
> >>>>>> virtual
> >>>>>>> network I was suggesting in my first strategy. Unfortunately, I met
> >>>>>> with
> >>>>>>> the same "AttributeError: module 'yaml' has no attribute
> >>>>>> 'FullLoader'"
> >>>>>>> error that inspired me to begin using Docker several years ago. Of
> >>>>>> course I
> >>>>>>> should note that "pip/pip2/pip3 install pyyaml" all report that
> >>>>>> pyyaml is
> >>>>>>> already installed, so I would be in debt to anyone who has an idea
> >>>>>> about
> >>>>>>> that error.
> >>>>>>>
> >>>>>>> To conclude, I find virtual networks opaque, and I would be
> grateful
> >>>>>> for
> >>>>>>> any guidance. If you have a different idea how I might achieve my
> >>>>>> goal, I
> >>>>>>> would be similarly effusive in my thanks.
> >>>>>>>
> >>>>>>> Cheers,
> >>>>>>> Michael Neises
> >>>>>>>
> >>>>>> _______________________________________________
> >>>>>> Devel mailing list -- devel@sel4.systems
> >>>>>> To unsubscribe send an email to devel-leave@sel4.systems
> >>>>>>
> >>>>>
> > _______________________________________________
> > Devel mailing list -- devel@sel4.systems
> > To unsubscribe send an email to devel-leave@sel4.systems
>
> _______________________________________________
> Devel mailing list -- devel@sel4.systems
> To unsubscribe send an email to devel-leave@sel4.systems
>
_______________________________________________
Devel mailing list -- devel@sel4.systems
To unsubscribe send an email to devel-leave@sel4.systems

Reply via email to