假设我在美国/英国以外的一家大型服务机构工作。我们广泛使用 UNIX 和 Linux 服务器。
通读这篇文章,它提到将后门插入 C 编译器很容易,然后用该编译器编译的任何代码也将包含后门。现在鉴于最近有关 NSA/GCHQ 授权在所有加密方法、硬件和软件中放置后门/弱点的泄密事件,编译器现在是一个关键的故障点。可能所有标准的 UNIX/Linix 发行版都可能受到损害。我们不能让流氓政府损害我们的系统、数据和客户数据。
鉴于这些信息,我想从头开始构建一个受信任的编译器,然后我有一个安全的基础来构建,这样我就可以使用该编译器从源代码构建操作系统和应用程序。
从源代码编译编译器(一个看似鸡生蛋的场景)然后从头开始编译受信任的 Unix/Linux 发行版的正确(和安全方法)是什么?
您可以假设我或其他人有能力阅读和理解安全漏洞的源代码,因此在编译之前将首先审查源代码。我真正想要的是一份从头开始安全地生成这个编译器的工作指南,可用于编译内核、操作系统的其他部分和应用程序。
如果我们要对在该堆栈上运行的操作系统或应用程序有任何信心,安全堆栈必须从基础级别开始。是的,我知道可能存在硬件后门,它们可能会在编译器构建时将一些微代码插入到编译器中。除了可能使用不是在美国设计的芯片之外,我们目前对此无能为力。让我们先对这一层进行排序,并假设我可以在插入任何后门之前在旧计算机上构建它。
正如布鲁斯·施奈尔 (Bruce Schneier) 所说:“我对工程师们说:我们建立了互联网,我们中的一些人帮助颠覆了它。现在,我们这些热爱自由的人必须修复它。”
额外链接:
有没有机会知道在 Linux 下如何构建二进制文件?(和或其他 Unix)
编译器、版本、时间、标志等...
我查看readelf并找不到太多内容,但可能还有其他方法可以分析二进制代码/部分等...
你知道怎么提取吗?
假设我有一个静态main.c链接到libmine.a. 静态链接到库会导致库函数在编译时嵌入到主可执行文件中。
如果libmine.a要提供 未使用的函数main.c,编译器(例如 GCC)会丢弃这些函数吗?
这个问题的灵感来自于“常见消息传递”,即使用静态库会使可执行文件更大,所以我很好奇编译器是否至少从存档文件中删除未使用的代码。
我购买了人机界面 (Exor Esmart04)。在 Linux 3.10.12 上运行,但是这个 Linux 被精简并且没有 C 编译器。另一个问题是磁盘空间:
我已经尝试在其上安装 GCC,但我没有足够的磁盘空间,是否有人有其他解决方案或其他需要较少磁盘空间的 C 编译器?
经过一番谷歌搜索,我找到了一种将 BASH 脚本编译为二进制可执行文件的方法(使用shc)。
我知道 shell 是一种解释性语言,但是这个编译器有什么作用呢?它会以任何方式提高我的脚本的性能吗?
我正在尝试运行我的第一个“进程”程序,但出现以下错误:
./fork.c: line 4: syntax error near unexpected token `('
./fork.c: line 4: `int main()'
Run Code Online (Sandbox Code Playgroud)
我很确定代码是正确的:
#include <sys/types.h>
#include <stdio.h>
int main() {
pid_t pid;
printf("Hello fork()\n");
switch(pid=fork()) {
case -1: printf("Error by fork().....\n"); exit(0);
case 0: printf("I'm the child process \n"); break;
default: printf("I'm the dad \n"); break;
}
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
怎么了?
我需要一个程序来编译python源代码;正如我一开始发现的那样,我需要从我的 python 脚本中创建一个二进制文件。
我已经检查了很多链接,但仍然没有找到适用于 Linux 的东西。
我找到py2bin了 OS/X,但没有适用于 Linux 的版本。
我知道我可以make随时中断进程,而无需再次重新编译整个源代码树。据我所知,make只有在尚未编译的情况下才编译目标,或者在上次编译后修改了源代码。
但是如果我中断make,肯定会有一个或多个(取决于并发级别)半就绪的二进制文件。下次我跑步时,它们对我有make什么作用?或者当我按Ctrl+C以避免部分编译的二进制文件时它是否完成了当前目标?
我在玩 chroot 环境,我想要一个可移植的 C 编译器,这样我就可以在每个环境中轻松设置一些基本的构建工具,而不必移动太多的库。
对于我想做的事情,gcc 似乎很臃肿,但是如果构建静态 gcc 相当容易,我不会介意几十兆字节。
我也在看 Tiny C Compiler,它更小,但看起来仍然有令人印象深刻的功能集。但是,在源目录中运行 ./configure --help 没有列出任何用于静态构建 tcc 的选项,我不确定否则如何完成。
Unix 的早期版本包括 Doug McIlroy 的工具tmg(“transmogrifier”),一个早期的编译器-编译器。TMG 是用 Dennis Ritchie 的汇编语言以及 TMGL 本身(TMG 翻译成汇编的语言)实现的。这是TMG 的手册(1972)。这是来自第 6 版 Unix 的完整源代码。
由于我试图了解 McIlroy 对 TMG 的实施是如何工作的,因此我正在阅读该文件tmgl.s,这tmgl.t是由 TMG 完成的翻译。我对以下摘录感到困惑:
.1=.
1
.2=.
2
.3=.
Run Code Online (Sandbox Code Playgroud)
和:
goto;..2
..3:null
..2:
Run Code Online (Sandbox Code Playgroud)
我阅读了PAL-11R和Unix 汇编手册,但不记得有任何解释。
特别:
.意思是“位置计数器”,但什么是.3=.?..意思是“搬迁柜台”,但什么是..3?(更糟糕的是,这种语法似乎只在 TMG 实现中遇到,而不是 Unix V6 的任何其他源文件。而且,为了排除损坏代码或逐步淘汰语法的可能性,TMG 源实际上是在Python 中编译的运行 Unix V6 的PDP-11 模拟器。)
compiler ×10
linux ×5
compiling ×4
c ×3
gcc ×2
assembly ×1
debugging ×1
disk-usage ×1
elf ×1
executable ×1
interrupt ×1
kernel ×1
libraries ×1
make ×1
performance ×1
python ×1
shell ×1
shell-script ×1