Zig para Segurança Cibernética
A maioria das vulnerabilidades críticas de software (buffer overflows, use-after-free, null pointer dereferences) são causadas por erros de gerenciamento de memória. Zig elimina classes inteiras dessas vulnerabilidades em tempo de compilação, tornando-se uma escolha natural para software de segurança.
Segurança de Memória Built-in
const std = @import("std");
// Zig previne buffer overflow automaticamente
test "bounds checking previne overflow" {
var buffer: [10]u8 = undefined;
const indice: usize = 15;
// Em modo Debug/ReleaseSafe, isso gera um panic
// em vez de acessar memória inválida
// buffer[indice] = 42; // panic: index out of bounds
// A forma segura:
if (indice < buffer.len) {
buffer[indice] = 42;
}
_ = buffer;
}
// Tipos opcionais eliminam null pointer dereferences
fn buscarUsuario(id: u64) ?*const Usuario {
// Retorna null explicitamente, sem ponteiros pendentes
_ = id;
return null;
}
Criptografia com std.crypto
const std = @import("std");
const crypto = std.crypto;
/// Hash seguro de senha com Argon2
fn hashSenha(senha: []const u8, salt: [16]u8) [32]u8 {
var hash: [32]u8 = undefined;
crypto.pwhash.argon2.strHash(senha, .{
.salt = salt,
}, &hash) catch unreachable;
return hash;
}
/// Criptografia AES-256-GCM
fn encriptar(
plaintext: []const u8,
chave: [32]u8,
nonce: [12]u8,
allocator: std.mem.Allocator,
) ![]u8 {
const ciphertext = try allocator.alloc(u8, plaintext.len);
var tag: [16]u8 = undefined;
crypto.aead.aes_gcm.Aes256Gcm.encrypt(
ciphertext,
&tag,
plaintext,
&.{},
nonce,
chave,
);
return ciphertext;
}
/// Comparação em tempo constante (previne timing attacks)
fn comparacaoSegura(a: []const u8, b: []const u8) bool {
return crypto.utils.timingSafeEql(a, b);
}
Scanner de Portas
const std = @import("std");
const net = std.net;
fn scanPorta(host: []const u8, porta: u16, timeout_ms: u32) bool {
const endereco = net.Address.resolveIp(host, porta) catch return false;
const socket = std.posix.socket(
endereco.any.family,
std.posix.SOCK.STREAM | std.posix.SOCK.NONBLOCK,
0,
) catch return false;
defer std.posix.close(socket);
// Tentar conectar com timeout
std.posix.connect(socket, &endereco.any, endereco.getOsSockLen()) catch |err| {
if (err != error.WouldBlock) return false;
};
// Esperar conexão com poll
var fds = [_]std.posix.pollfd{.{
.fd = socket,
.events = std.posix.POLL.OUT,
.revents = 0,
}};
const ready = std.posix.poll(&fds, timeout_ms) catch return false;
return ready > 0 and (fds[0].revents & std.posix.POLL.OUT != 0);
}
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
const host = "127.0.0.1";
try stdout.print("Scanning {s}...\n", .{host});
for (1..1025) |porta| {
if (scanPorta(host, @intCast(porta), 200)) {
try stdout.print("Porta {d}: ABERTA\n", .{porta});
}
}
}
Conclusão
Zig combina segurança de memória em tempo de compilação com performance de linguagem de sistemas, tornando-a ideal para ferramentas de segurança cibernética. A biblioteca padrão inclui implementações criptográficas auditadas, e a ausência de undefined behavior (em modo Safe) elimina classes inteiras de vulnerabilidades.
Conteúdo Relacionado
- Error Handling em Zig — Tratamento de erros seguro
- Segurança de Memória em Zig — Tutorial de memória
- Zig em Módulos do Kernel — Segurança no kernel
- Networking em Zig — Sockets e rede
- Fuzz Testing — Encontrando vulnerabilidades