Một câu chuyện thú vị trong giới công nghệ vừa nhận được hơn 1.000 lượt bình chọn trên Hacker News: hành trình của một ký tự duy nhất, dấu *, xuyên suốt gần nửa thế kỷ lịch sử Unix.

Từ năm 1980 đến lớp bảo vệ mật khẩu

Năm 1980, Bill Joy đặt dấu * vào trường mật khẩu của tài khoản daemon trong tệp /etc/passwd. Dấu * không phải là một mã băm hợp lệ, nên không mật khẩu nào có thể khớp. Nhờ vậy, không ai đăng nhập được vào tài khoản này. Cách làm đó vẫn được dùng đến ngày nay, với mật khẩu nay nằm trong tệp /etc/shadow.

Khi hàm crypt() thất bại

Theo chuẩn Unix, hàm crypt() trả về NULL khi không thể tính mã băm. Nhưng nhiều chương trình không kiểm tra NULL và bị sập. Năm 2012, musl, thư viện nền của Alpine Linux, đổi sang trả về một chuỗi thay thế. Họ chọn đúng dấu * và nó không bao giờ khớp với mật khẩu thật.

Ba tuần sau, musl thêm sha512 crypt và giới hạn mật khẩu tối đa 256 byte để chống kẻ gửi mật khẩu khổng lồ làm máy chủ quá tải. Mật khẩu dài hơn sẽ khiến crypt() thất bại và trả về dấu *.

Lỗ hổng CVE-2016-6210

Năm 2016, các nhà nghiên cứu phát hiện sshd trả lời nhanh hơn với người dùng không tồn tại vì không phải băm gì cả. Chỉ cần đo thời gian là biết tài khoản nào có thật. Bản vá khá thú vị: sshd mượn salt của một tài khoản khác để băm mật khẩu cho tốn thời gian tương đương. Đây là bài học đáng nhớ về bảo mật trong phần mềm.