D - Compile time support for Run-time Security
- andy (24/24) Sep 07 2002 One of the things that is really nice about D is that its pretty dern
- Walter (7/31) Sep 07 2002 I don't think this is possible with a language designed to allow access ...
- andy (45/91) Sep 08 2002 Okay well thanks for considering it.
- Mark Evans (9/9) Sep 08 2002 I'm glad to see someone is mentioning security. Usually security is tac...
- Walter (18/26) Sep 08 2002 tacked on
- Jonathan Andrew (5/5) Sep 08 2002 I think one big step in this direction is ensuring the standard library ...
One of the things that is really nice about D is that its pretty dern light weight and efficient by comparison to most language coming out of the wood work today. However, while this is D's power, its also its weakness in the realm of Security. D allows all "Things" to have access to the underlying runtime library, anything out there, call any function of phobos etc. It seems to me that most of the languages that support limiting this either through policy configuration, etc. are all "Virtual Machine" languages. (I'm NOT distinguishing here between language and "all that other stuff to support it" and I'm aware of it) I however am not sure that it is essential to use a VM. It seems to me that the compiler could chose to compile in runtime support for security policy or not and the caller of a given object or call should be able to determine what priviledges it is to be granted. Configuring this could be left up to the implementer, with basic support supplied through an API. While I realize this is not as secure as a VM or something of the such, I think it could provide a substantial layer of protection for a number of web applications. Does anyone have any thoughts on this? Walter, any plans to provide such "security"? I can provide some implementation suggestions if anyone is interested. -Andy
Sep 07 2002
I don't think this is possible with a language designed to allow access to the bare metal. Heck, you can always just link in a C function to get around any D protections. The sandbox here should be the operating system allocating a virtual address space for the process, and then using privilege levels. "andy" <acoliver apache.org> wrote in message news:3D7A44B2.2080609 apache.org...One of the things that is really nice about D is that its pretty dern light weight and efficient by comparison to most language coming out of the wood work today. However, while this is D's power, its also its weakness in the realm of Security. D allows all "Things" to have access to the underlying runtime library, anything out there, call any function of phobos etc. It seems to me that most of the languages that support limiting this either through policy configuration, etc. are all "Virtual Machine" languages. (I'm NOT distinguishing here between language and "all that other stuff to support it" and I'm aware of it) I however am not sure that it is essential to use a VM. It seems to me that the compiler could chose to compile in runtime support for security policy or not and the caller of a given object or call should be able to determine what priviledges it is to be granted. Configuring this could be left up to the implementer, with basic support supplied through an API. While I realize this is not as secure as a VM or something of the such, I think it could provide a substantial layer of protection for a number of web applications. Does anyone have any thoughts on this? Walter, any plans to provide such "security"? I can provide some implementation suggestions if anyone is interested. -Andy
Sep 07 2002
Okay well thanks for considering it.
More I was thinking that one could specify by default that a child
could not call C functions. And if it wanted to allow specific calls
it could allow them.
Languages with this kind of "sandbox" as you call it are strongly
suggested by the Linux Security FAQ:
http://www.tldp.org/HOWTO/Security-HOWTO/index.html and other security
references.
While I understand that D is a more bare metal language than most
langauges that do provide these services, it provides other features
such as garbage collection that are traditionally not provided in bare
metal languages.
The way I see this working is:
DCallerClass DChildClass
DChildClass2 DClassSecurityDescriptorForChildClass
DClassSecurityDescriptorForChildClass2
ClassSecurityDescriptor objects just hold property-value pairs. By
default a class which is insantiated via a security descriptor can
basically do nothing. You can specify some kind of wild card "Do
anything" to subvert protection if needed.
DClassSecurityDescriptorForChildClass specifies that it can make calls
to objects within its own module, it cannot do IO or anything else of
substance.
DClassSecurityDescriptorForChildClass2 specifies that it can call the
printf function as well as any class in its own module.
DCallerClass instantiates DChildClass with the
DClassSecurityDescriptorForChildClass. DCallerClass insantiates
DChildClass2 with the DClassSecurityDescriptorForChildClass2.
DCallerClass passes a reference to the DChildClass2 into DChildClass.
It then executes the run() method on DChildClass which executes a method
on DChildClass2 and prints "hello secure world" on the screen.
Because DCallerClass was instantiated without a security descriptor, it
has permission to do anything it wants. It allowed DChildClass and
DChildClass2 some subset of this. In this case it allowed DChildClass
to make calls to DChildClass2. Because DCallerClass allowed
DChildClass2 to make a call to printf.
As for how to do this in the compiler I can only make some guesses. A
different form of a constructor (maybe new Bla() : descriptorInstance;)
would be used. In the event a construction was done with a security
descriptor, the class is linked with all method calls being done via
that security descriptor.
It doesn't seem totall unfeasible to me, but I haven't given it that
much thought.
-Andy
Walter wrote:
I don't think this is possible with a language designed to allow access to
the bare metal. Heck, you can always just link in a C function to get around
any D protections. The sandbox here should be the operating system
allocating a virtual address space for the process, and then using privilege
levels.
"andy" <acoliver apache.org> wrote in message
news:3D7A44B2.2080609 apache.org...
One of the things that is really nice about D is that its pretty dern
light weight and efficient by comparison to most language coming out of
the wood work today.
However, while this is D's power, its also its weakness in the realm of
Security.
D allows all "Things" to have access to the underlying runtime library,
anything out there, call any function of phobos etc.
It seems to me that most of the languages that support limiting this
either through policy configuration, etc. are all "Virtual Machine"
languages. (I'm NOT distinguishing here between language and "all that
other stuff to support it" and I'm aware of it)
I however am not sure that it is essential to use a VM. It seems to me
that the compiler could chose to compile in runtime support for security
policy or not and the caller of a given object or call should be able to
determine what priviledges it is to be granted.
Configuring this could be left up to the implementer, with basic support
supplied through an API.
While I realize this is not as secure as a VM or something of the such,
I think it could provide a substantial layer of protection for a number
of web applications.
Does anyone have any thoughts on this? Walter, any plans to provide
such "security"?
I can provide some implementation suggestions if anyone is interested.
-Andy
Sep 08 2002
I'm glad to see someone is mentioning security. Usually security is tacked on after the fact. (I wish that security had been considered in the design of our 30-year-old email message standard.) I have no opinion on the particular suggestion here, but do think that it's worth considering D's support for commercial software products in need of various protections. For example -- code obfuscation (compiler renaming of all symbols with junk names); on-the-fly binary code encryption/decryption; self-modifying code; hash functions; computer station uniqueness identifiers. Mark
Sep 08 2002
"Mark Evans" <Mark_member pathlink.com> wrote in message news:algdvm$2omq$1 digitaldaemon.com...I'm glad to see someone is mentioning security. Usually security istacked onafter the fact. (I wish that security had been considered in the designof our30-year-old email message standard.)Security is an important issue. One issue is preventing malicious D code from running - that doesn't make too much sense for D since D is a systems development language. It's more an operating system issue. The next security issue is making security bugs in existing D applications less exploitable - for example, the infamous buffer overflow bug. Since D has dynamic arrays, and they are convenient to use, it is much less likely for a poorly written D app to suffer from buffer overflow bugs than a poorly written C app. D also has various runtime checks and contracts which can be used to increase security of a trusted app.I have no opinion on the particular suggestion here, but do think thatit'sworth considering D's support for commercial software products in need of various protections. For example -- code obfuscation (compiler renamingof allsymbols with junk names); on-the-fly binary code encryption/decryption; self-modifying code; hash functions; computer station uniquenessidentifiers. Since D is easy to parse, it makes it that much easier to write code obfuscators.
Sep 08 2002
I think one big step in this direction is ensuring the standard library is free of potential buffer overflow exploits. Many of the functions in the C standard library are vulnerable to buffer overflows, hopefully phobos will be better in this regard. -Jon
Sep 08 2002









"Walter" <walter digitalmars.com> 