I have implemented something like that actually:
https://github.com/cgohla/pledgeWorking out a portable API could be
difficult.Sent from my Galaxy
-------- Original message --------From: Hécate <hec...@glitchbra.in> Date:
27/12/22 20:39 (GMT+00:00) To: ghc-devs@haskell.org Subject: Re: Deprecating
Safe Haskell, or heavily investing in it? Thanks for your input Viktor!I came
across the nsjail system from Google a little while after posting this thread:
https://github.com/google/nsjail/#overviewPerhaps we could get the most value
for our buck if we externalise the solution to work with OS-level
mechanisms?What do you think of that? Something based upon eBPF would certainly
incur less modifications to the RTS?Le 27/12/2022 à 21:12, Viktor Dukhovni a
écrit :> On Tue, Dec 27, 2022 at 06:09:59PM +0100, Hécate wrote:>>> Now, there
are two options (convenient!) that are left to us:>>>> 1. Deprecate Safe
Haskell: We remove the Safe mechanism as it exists>> today, and keep the IO
restriction under another name. This will>> certainly cause much joy amongst
maintainers and GHC developers alike.>> The downside is that we don't have a
mechanism to enforce "Strict>> type-safety" anymore.>>>> 2. We heavily invest
in Safe Haskell: This is the option where we amend>> the PVP to take changes of
Safety annotations into account, invest in>> workforce to fix the bugs on the
GHC side. Which means we also invest in>> the tools that check for PVP
compatibility to check for Safety. This is>> not the matter of a GSoC, or a
2-days hackathon, and I would certainly>> have remorse sending students to the
salt mines like that.>>>> I do not list the Status Quo as an option because it
is terrible and has>> led us to regularly have complaints from both GHC &
Ecosystem libraries>> maintainers. There can be no half-measures that they
usually tend to>> make us slide back into the status quo.>>>> So, what do you
think?> I think that "Restricted IO" would in principle be the more sensible>
approach. HOWEVER, for robust "sandboxing" of untrusted code what's> required
is more than just hiding the raw IO Monad from the sandboxed> code. Doing that
securely is much too difficult to do correctly, as> evidenced by the ultimate
failure (long history of bypass issues) of> similar efforts for enabling
restricted execution of untrusted code in> Java (anyone still using Java
"applets", or running Flash in their> browser???).>> The only way to do this
correctly is to provide strong memory separation> between the untrusted code
and the TCB. The only mainstream working> examples of this that I know of
are:>> * Kernel vs. user space memory separation.>> * Tcl's multiple
interpreters, where untrusted code runs in> slave interpreters stripped
of most verbs, with aliases> added to wrappers that call back into the
parent interpreter> for argument validation and restricted execution.>>
Both systems provide strong memory isolation of untrusted code, only> data
passes between the untrusted code and the TCB through a limited> set of
callbacks (system calls if you like).>> For "Safe Haskell" to really be *safe*,
memory access from untrusted> code would need to be "virtualised", with a
separate heap and foreign> memory allocator for evaluation of untrusted code,
and the RTS rewriting> and restricting all direct memory access. This means
that "peek" and> "poke" et. al. would not directly read memory, but rather be
restricted> to specific address ranges allocated to the untrusted task.>>
Essentially the RTS would have to become a user-space microkernel.>> This is in
principle possible, but it is not clear whether this is worth> doing, given
limited resources.>> To achieve "safe" execution, restricted code needs to give
up some> runtime performance, just compile-time safety checks are not>
sufficiently robust in practice. For example, the underlying byte> arrays
(pinned or not) behind ByteString and Text when used from> untrusted code would
not allow access to data beyond the array bounds> (range checked on every
access), ... which again speaks to some> "virtualisation" of memory access by
the RTS, at least to the extent of> always performing range checks when running
untrusted code.>> Bottom line, I don't trust systems like Safe Haskell, or
Java's> type-system-based sandboxing of untrusted code, ... that try to
perform> sandboxing in a shared address space by essentially static analysis>
alone. We've long left shared address space security systems DOS and> MacOS 9
behind... good riddance.>-- Hécate ✨🐦: @TechnoEmpressIRC: HecateWWW:
https://glitchbra.inRUN:
BSD_______________________________________________ghc-devs mailing
listghc-devs@haskell.orghttp://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs