- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图在 Linux 命令行上使用相同的密码更方便地挂载多个 Veracrypt 卷。由于 Veracrypt 仅支持 GUI 模式下的密码缓存,因此我编写了以下代码来为我完成这项工作:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<time.h>
int main(int argc, char* argv[]){
if(argc > 1 && argc%2==1){
srand(time(0));
//prevent veracrypt from asking for user's passphrase
system("sudo echo -n");
char *buffer = getpass("Veracrypt Password:");
for(int i = 1; i<argc; i+=2){
char* cc;
cc = (char *) malloc(57+strlen(argv[i])+1+strlen(argv[i+1]));
strcpy(cc, "veracrypt -t --protect-hidden=no --keyfiles=\"\" --pim=123 ");
strcat(cc, argv[i]);
strcat(cc, " ");
strcat(cc, argv[i+1]);
FILE* fChild = popen(cc, "w");
fprintf(fChild, "%s", buffer);
pclose(fChild);
free(cc);
}
for(int i = 0; i<strlen(buffer); i++)
buffer[i] = rand();
}
return 0;
}
代码有效,但我想知道密码是否在执行后从内存中正确删除。如上面的代码所示,密码短语首先被读入字符数组缓冲区,最后替换为随机值。
我的两个问题是:
这种方法到底是不是个好主意? (安全方面)
buffer 的值是如何通过 popen() 传递给 veracrypt 的?/buffer 是直接从其位置读取还是被复制并因此可以保留在内存中的某个位置?
最佳答案
该方法是可行的,并且与在 shell 中通过管道传递密码一样安全 <<<"myPassword" veracrypt
.
ps
中没有密码输出。您的代码根本不安全。
cc
分配的内存.您没有为终止空字符分配位置。你可以使用 asnprintf
让 GNU 库为您完成这项工作。argv[i]
和 argv[i+1]
使用您的程序攻击任何 PC 非常简单,例如:./your_program "; sudo rm -rf <some_file>" "; echo I can run any shell script here"
.Is this approach a good idea at all? (securitywise)
方法是好的,你如何接近它是不对的。您的程序泄漏内存并且不检查任何返回值并且无法控制传递给 popen
的字符串,这是不安全的。使用 system(sudo echo -n)
也没有安全感。至于方法,最好在最后一次使用后将缓冲区清零 memset(buffer, 0, strlen(buffer) + 1)
(可能多次,比如 5 次),然后是 free(buffer)
.
鉴于最近的 Meltdown 和 Spectre 等攻击,较新的 ssh 版本在从用户收到密码后立即使用长 key (我认为使用 RSA,不确定)加密密码,并在每次使用时解密。 key 足够长,使得使用此类方法的攻击不太可能或太长。我认为不需要简单的小应用程序来实现这种方法。 source .
How is the value of buffer piped to veracrypt by popen()?
因为你使用 fprintf
,缓冲区被复制到内部 FILE*
缓冲区,然后在换行符上刷新。默认 FILE*
流在换行符上被缓冲和刷新。您可以使用 setvbuf
指定行为,但是,我认为它根本不安全,因为密码将保留在 FILE*
中。缓冲一段时间。然后 fprintf
调用写入内部的内容FILE*
使用 FILE*
将换行符缓冲到关联的管道文件描述符指针。然后内核将数据从管道的输入传递到命令的标准输入。更安全一点的方法(因为你根本不需要 printf
实用程序,你只是 "%s"
...),可能是使用 setvbuf(fChild, NULL, _IONBF, 0)
然后使用 fwrite(buffer, strlen(buffer), 1, fChild)
.
正确的方法是删除 FILE*
并使用正确的 pipe()
+ fork()
+ exec()
并使用 write()
将密码直接传输到管道中打电话,所以你不使用FILE*
内部缓冲。 fork()
还将允许您发送信号并处理子项的返回值。
Is buffer read directly from its location or is it copied and can therefore remain somewhere in memory?
是的,是的,是的。它直接从它在 fprintf
中的位置读取。称呼。它被复制到内部 FILE*
缓冲。因此它可以保留在内存中的某个位置。
关于c - 使用 popen() 将密码短语传输到 Veracrypt - 它安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56821662/
我正在学习 Spring 安全性,但我对它的灵活性感到困惑.. 我知道我可以通过在标签中定义规则来保护网址 然后我看到有一个@secure 注释可以保护方法。 然后还有其他注释来保护域(或 POJO)
假设有一个 key 加密 key 位于内存中并且未写入文件或数据库... byte[] kek = new byte[32]; secureRandom.nextBytes(kek); byte[]
我有 Spring Security 3.2.0 RC1 的问题 我正在使用标签来连接我 这表示“方法‘setF
我正在创建一个使用 Node Js 服务器 API 的 Flutter 应用程序。对于授权,我决定将 JWT 与私钥/公钥一起使用。服务器和移动客户端之间的通信使用 HTTPS。 Flutter 应用
在过去的几年里,我一直在使用范围从 Raphael.js 的 javascript 库。至 D3 ,我已经为自己的教育操纵了来自网络各地的动画。我已经从各种 git 存储库下载了 js 脚本,例如 s
在 python 中实现身份验证的好方法是什么?已经存在的东西也很好。我需要它通过不受信任的网络连接进行身份验证。它不需要太高级,只要足以安全地获取通用密码即可。我查看了 ssl 模块。但那个模块让我
我正在尝试学习“如何在 Hadoop 中实现 Kerberos?”我已经看过这个文档 https://issues.apache.org/jira/browse/HADOOP-4487我还了解了基本的
我有一个带有 apache2、php、mysql 的生产服务器。我现在只有一个站点 (mysite.com) 作为虚拟主机。我想把 phpmyadmin、webalizer 和 webmin 放在那里
前些天在网上看到防火墙软件OPNsense,对其有了兴趣,以前写过一个其前面的一个软件M0n0wall( 关于m0n0wa
我在 Spring Boot 和 oauth2(由 Google 提供)上编写了 rest 后端,在 "/login" 上自动重定向。除了 web 的 oauth 之外,我还想在移动后端进行 Fire
我想调用类 Foo,它的构造函数中有抽象类 Base。我希望能够从派生自 Base 的 Derived 调用 Foo 并使用 Derived覆盖方法而不是 Base 的方法。 我只能按照指示使用原始指
如何提高 session 的安全性? $this->session->userdata('userid') 我一直在为我的 ajax 调用扔掉这个小坏蛋。有些情况我没有。然后我想,使用 DOM 中的
我目前正在为某些人提供程序集编译服务。他们可以在在线编辑器中输入汇编代码并进行编译。然后编译它时,代码通过ajax请求发送到我的服务器,编译并返回程序的输出。 但是,我想知道我可以做些什么来防止对服务
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
目前,我通过将 session 中的 key 与 MySQl 数据库中的相同 key 相匹配来验证用户 session 。我使用随机数重新生成 session ,该随机数在每个页面加载时都受 MD5
Microsoft 模式与实践团队提供了一个很棒的 pdf,称为:“构建安全的 asp.net 应用程序”。 microsoft pdf 由于它是为 .Net 1.0 编写的,所以现在有点旧了。有谁知
在 Lua 中,通常会使用 math.random 生成随机值和/或字符串。 & math.randomseed , 其中 os.time用于 math.randomseed . 然而,这种方法有一个
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我们有一个严重依赖 Ajax 的应用程序。确保对服务器端脚本的请求不是通过独立程序而是通过坐在浏览器上的实际用户的好方法是什么 最佳答案 真的没有。 通过浏览器发送的任何请求都可以由独立程序伪造。 归
我正在寻找使用 WebSockets 与我们的服务器通信来实现 web (angular) 和 iPhone 应用程序。在过去使用 HTTP 请求时,我们使用请求数据、url、时间戳等的哈希值来验证和
我是一名优秀的程序员,十分优秀!