我想让我的应用程序运行其他人的代码,也就是插件.但是,我有什么选择才能使其安全,因此他们不会编写恶意代码.我该如何控制他们能做什么或不能做什么?
我偶然发现JVM有一个"内置沙箱"功能 - 它是什么,这是唯一的方法吗?是否有用于制作沙箱的第三方Java库?
我有什么选择?赞赏指南和示例的链接!
我希望能够让用户提交任意JavaScript代码,然后将其发送到Node.JS服务器并安全执行,然后将输出发送回多个客户端(作为JSON).eval我想到了这个功能,但我知道这有多个安全问题(用户提交的代码可以访问Node的File API等).我见过一些项目,如Microsoft Web Sandbox和Google Caja,它们允许执行清理标记和脚本(用于在网站上嵌入第三方广告),但似乎这些是客户端工具,我不确定它们是否可以在Node中安全使用.
有没有一种标准的方法来沙盒并在Node中执行不受信任的JavaScript,从而获得输出.尝试做这个服务器端是错误的吗?
编辑:用户能够利用JavaScript的全部功能并不重要,事实上,最好能够选择将哪些API提供给用户代码.
编辑:我将继续使用我发现的内容进行更新.这个Sandcastle模块(bcoe/sandcastle)似乎旨在实现我的想法.不确定它有多安全,但由于我不是太重要,我想如果尝试的话.如果我能成功地做到这一点,我会添加自己的答案.
我在新的开发人员设计中看不到禁用它的选项!
请帮忙
有几种资源可以解释Chrome中的沙盒是如何工作的,以及它如何保护用户免受恶意代码的侵害.
Chromium博客
Chromium开发人员文档
沙箱常见问题解答
这很棒,我喜欢他们所拥有的以操作系统为中心的设计(有点像"操作系统可能知道如何更好地保护自己,所以我们让它"接近.)他们在几个地方也提到了sandbox本身被设计为不依赖于Chrome,而是或多或少独立,因此理论上只要程序的体系结构兼容,任何进程都可以进行沙盒化(沙盒代码必须作为自己的进程运行,因为它是一个孩子的非沙盒父母.)
我碰巧有一个应用程序,它的设计使沙盒成熟,并且能够让父/子进程使用它.我有Chromium代码并且......不知道下一步该做什么.
有没有人在那里实际上用沙盒装了什么呢?是否有任何资源记录了它的用法或API?我想它应该很简单,但我不知道从哪里开始.
编辑:我的答案在下面找到!
我们的Java应用程序的一部分需要运行由非开发人员编写的javascript.这些非开发人员使用javascript进行数据格式化.(主要是简单的逻辑和字符串连接).
我的问题是如何设置这些脚本的执行以确保脚本错误不会对应用程序的其余部分产生重大负面影响.
基本上我需要设置javascript范围,只包括他们需要的内容,而不是更多内容.
我想构建一个C预处理器/编译器,允许从本地和在线资源收集功能.即:
#fetch MP3FileBuilder http://scripts.com/MP3Builder.gz
#fetch IpodDeviceReader http://apple.com/modules/MP3Builder.gz
void mymodule_main() {
MP3FileBuilder(&some_data);
}
Run Code Online (Sandbox Code Playgroud)
这很容易.
困难的部分是我需要一种可靠的方法来"沙箱化"导入的代码,直接或不受限制地访问磁盘或系统资源(包括内存分配和堆栈).我想要一种方法来安全地运行不受信任的C代码(模块)的小片段,而没有将它们放在单独的进程,VM或解释器中的开销(尽管可以接受单独的线程).
要求
我很乐意接受C的一个子集.我不需要像模板或类这样的东西.我主要对高级语言不能像快速数学,位操作以及二进制数据的搜索和处理这样的事情感兴趣.
这是不现有C代码可以不加修改地重复使用,以创建一个模块的意图.目的是要求模块符合一组规则和限制,旨在将模块限制为基本逻辑和转换操作(例如视频转码或压缩操作).
这种编译器/预处理器的理论输入是单个ANSI C文件(或安全子集),带有module_main函数,NO包含或预处理器指令,没有ASM,它将允许循环,分支,函数调用,指针数学(限于分配给模块的范围),位移,位域,强制转换,枚举,数组,整数,浮点数,字符串和数学.其他任何东西都是可选的.
示例实施
这是一个伪代码片段,可以更好地解释这一点.这里一个模块超出了它的内存分配配额,并且还创建了无限递归.
buffer* transcodeToAVI_main( &in_buffer ) {
int buffer[1000000000]; // allocation exceeding quota
while(true) {} // infinite loop
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
这是一个转换版本,我们的预处理器添加了观察点来检查内存使用和递归,并将整个事件包装在异常处理程序中.
buffer* transcodeToAVI_main( &in_buffer ) {
try {
core_funcStart(__FILE__,__FUNC__); // tell core we're executing this function
buffer = …Run Code Online (Sandbox Code Playgroud) 它在一周之前运作良好,但现在它显示以下错误.我尝试过以下的东西,但没有用.
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
Run Code Online (Sandbox Code Playgroud)
所以建议我可能的解决方案
public string HttpCall(string NvpRequest) //CallNvpServer
{
string url = pendpointurl;
//To Add the credentials from the profile
string strPost = NvpRequest + "&" + buildCredentialsNVPString();
strPost = strPost + "&BUTTONSOURCE=" + HttpUtility.UrlEncode(BNCode);
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
// allows for validation of SSL conversations
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
objRequest.Timeout = Timeout;
objRequest.Method = "POST";
objRequest.ContentLength = strPost.Length;
try
{
using (StreamWriter myWriter = new StreamWriter(objRequest.GetRequestStream()))
{
myWriter.Write(strPost); …Run Code Online (Sandbox Code Playgroud) 关于Lua和Javascript是否支持对象能力模型,在cap-talk邮件列表上进行了一些讨论,得出的结论是,由于支持将环境限制为被调用函数setfenv,以及对不可变对象进行不可伪造引用的可能性,OCM可能是实现.
我们看过这个怎么样了?我有兴趣从现有应用程序中删除漏洞,在Lua中使用非常有用的,慷慨的脚本支持,遗憾的是在各种情况下允许完全shell访问.需要一些shell访问:对象能力模型似乎是管理事物的好方法.但是我担心一个案例我可以说是多么令人信服,这种方法实际上可以确保在确定的混乱实践中是安全的.
一些链接:
setfenv在行动; 显示表格背后的基本思想,在适当的情况下,可以只读这是我第二次在Visual Studio 2015中看到错误"Scripted Sandbox64.exe已停止工作".
在我的特定情况下,我正在构建Windows窗体应用程序,并将应用程序放入Windows中的系统托盘中.此应用程序还使用System.IO写入文件.该项目只有这一点.Visual Studio 2015社区版崩溃.