[GHC] #10826: [Security] Safe Haskell can be bypassed via annotations
GHC
ghc-devs at haskell.org
Wed Sep 2 02:22:30 UTC 2015
#10826: [Security] Safe Haskell can be bypassed via annotations
-------------------------------------+-------------------------------------
Reporter: spinda | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.10.2
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
Type of failure: GHC accepts | Unknown/Multiple
invalid program | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Revisions:
-------------------------------------+-------------------------------------
Description changed by spinda:
Old description:
> {{{
> module Test (hook) where
>
> import System.Process
> import System.IO.Unsafe
>
> {-# ANN hook (unsafePerformIO (putStrLn "Woops.")) #-}
> hook = undefined
> }}}
>
> {{{
> ➜ Test ghc -fpackage-trust -XSafe Test_simple.hs
> [1 of 1] Compiling Test_simple ( Test_simple.hs, Test_simple.o )
> [flags changed]
> Woops.
>
> Test_simple.hs:4:1:
> System.IO.Unsafe: Can't be safely imported!
> The module itself isn't safe.
> }}}
>
> GHC ultimately rejects the program due to the {{{System.IO.Unsafe}}}
> import, but this check doesn't occur until GHC has compiled and run the
> annotation expression, allowing arbitrary IO operations via
> {{{unsafePerformIO}}}.
>
> The solution is probably to move the import check from the end of
> renaming/typechecking to the start.
New description:
{{{
module Test (hook) where
import System.IO.Unsafe
{-# ANN hook (unsafePerformIO (putStrLn "Woops.")) #-}
hook = undefined
}}}
{{{
➜ Test ghc -fpackage-trust -XSafe Test_simple.hs
[1 of 1] Compiling Test_simple ( Test_simple.hs, Test_simple.o )
[flags changed]
Woops.
Test_simple.hs:4:1:
System.IO.Unsafe: Can't be safely imported!
The module itself isn't safe.
}}}
GHC ultimately rejects the program due to the {{{System.IO.Unsafe}}}
import, but this check doesn't occur until GHC has compiled and run the
annotation expression, allowing arbitrary IO operations via
{{{unsafePerformIO}}}.
The solution is probably to move the import check from the end of
renaming/typechecking to the start.
--
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10826#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list