Caller ID trên điện thoại bạn là giả - và mạng viễn thông không thể làm gì

Caller ID spoofing hoạt động vì SS7 thiết kế từ 1980s không có xác thực. Phân tích kỹ thuật từ SIP header đến PSTN Gateway, tại sao Việt Nam đặc biệt dễ bị tấn công.

Caller ID trên điện thoại bạn là giả - và mạng viễn thông không thể làm gì

Tôi vừa gọi cho chính mình. Máy hiển thị số của một người hoàn toàn khác - đúng tên trong danh bạ, đúng avatar, cuộc gọi bình thường không khác gì. Nếu không phải tôi đang cầm cả hai máy, tôi sẽ tin tuyệt đối rằng người kia đang gọi.

Công cụ tôi dùng? Một ứng dụng thay đổi giọng nói khi gọi điện. Tôi kéo về, phân tích, và phát hiện nó nguy hiểm hơn rất nhiều so với vẻ ngoài vô hại. Nhưng bài viết này không phải về ứng dụng đó - nó chỉ là triệu chứng. Câu hỏi thực sự lớn hơn nhiều: tại sao hệ thống viễn thông toàn cầu, sau hàng chục năm phát triển, vẫn cho phép bất kỳ ai giả mạo số điện thoại hiển thị khi gọi đến bạn?

Câu trả lời nằm sâu trong kiến trúc của mạng điện thoại - một hệ thống được thiết kế từ thập niên 1980, khi "trust" còn là mặc định.

Caller ID hoạt động như thế nào - câu chuyện của 40 năm tin tưởng

Để hiểu tại sao caller ID spoofing tồn tại, bạn cần hiểu caller ID thực sự là gì. Nó không phải một cơ chế xác thực. Nó là một lời tự khai - và mạng viễn thông tin lời tự khai đó mà không kiểm tra.

Bên trong mạng GSM: cuộc gọi đi qua những gì?

Luồng cuộc gọi trong mạng GSM - từ điện thoại qua BTS, MSC, đến SS7 signaling

Khi bạn nhấn nút gọi trên điện thoại, cuộc gọi không bay thẳng đến người nhận. Nó đi qua một chuỗi hạ tầng:

Điện thoại → BTS (trạm phát sóng) → MSC (tổng đài di động) → ... → MSC đích → Điện thoại người nhận

BTS (Base Transceiver Station) là cột sóng gần nhất. Nó chỉ làm một việc: chuyển tín hiệu radio từ điện thoại bạn thành tín hiệu số để đẩy lên mạng core.

MSC (Mobile Switching Center) là bộ não thực sự - tổng đài di động. MSC quyết định cuộc gọi đi đâu, kết nối với tổng đài nào, và quan trọng nhất: nó gán thông tin báo hiệu cho cuộc gọi, bao gồm Calling Party Number (CPN) - chính là caller ID.

Giữa các tổng đài, thông tin báo hiệu được truyền qua SS7 (Signaling System 7) - giao thức báo hiệu ra đời từ thập kỷ 1980. Khi MSC nguồn muốn thiết lập cuộc gọi, nó gửi một message gọi là IAM (Initial Address Message) qua mạng SS7. Trong IAM có hai trường quan trọng:

  • CPN (Calling Party Number): Số người gọi - caller ID
  • CDN (Called Party Number): Số người nhận

Đây là điểm mấu chốt đầu tiên: khi cuộc gọi đến từ trong mạng GSM, CPN được tổng đài tự động gán dựa trên SIM card. Bạn không thể thay đổi. SIM của bạn gắn với số nào, MSC biết và gán chính xác số đó. Hệ thống này hoạt động vì tổng đài kiểm soát toàn bộ quá trình - điện thoại không có quyền tự khai số.

Nhưng câu chuyện thay đổi hoàn toàn khi cuộc gọi đến từ bên ngoài mạng GSM.

VoIP xuất hiện - và phá vỡ mô hình tin tưởng

So sánh GSM Call (Trusted) vs VoIP Call (Untrusted) - người nhận không thể phân biệt

Vào đầu những năm 2000, VoIP (Voice over IP) bắt đầu phổ biến. Thay vì gọi qua mạng di động, bạn có thể gọi qua internet bằng giao thức SIP (Session Initiation Protocol). Các công ty, tổng đài ảo, dịch vụ call center đều dùng SIP trunk để kết nối vào mạng điện thoại truyền thống (PSTN).

SIP là giao thức báo hiệu cho VoIP, tương đương vai trò của SS7 trong mạng truyền thống. Khi một hệ thống VoIP muốn thiết lập cuộc gọi, nó gửi một SIP INVITE request:

INVITE sip:[email protected] SIP/2.0
From: <sip:[email protected]> ← CALLER ID Ở ĐÂY
To: <sip:[email protected]>
Call-ID: [email protected]

Header From: chứa caller ID. Và đây là vấn đề: trong SIP, header này hoàn toàn do client tự set. Không có cơ chế xác thực built-in. Client ghi số gì, server nhận số đó.

Ngoài From:, SIP còn có header P-Asserted-IdentityRemote-Party-ID - những header mà SIP trunk dùng để truyền thông tin caller ID. Nhà cung cấp nào "lỏng" sẽ cho phép client set các header này thành bất kỳ số nào.

Khi cuộc gọi VoIP cần ra mạng GSM (gọi đến số điện thoại thật), nó phải đi qua một PSTN Gateway - thiết bị bridge giữa thế giới IP và thế giới viễn thông truyền thống. Gateway này làm một việc đơn giản: lấy số từ header From: trong SIP, nhét vào trường CPN trong message IAM của SS7, rồi gửi đi:

PSTN Gateway chuyển đổi SIP From header thành SS7 CPN mà không verify
Chi tiết các bước xử lý bên trong PSTN Gateway - từ SIP INVITE đến SS7 IAM

Tổng đài nhận (MSC đích) nhìn thấy CPN trong IAM và tin tưởng hoàn toàn. Nó không kiểm tra số đó có thực sự thuộc về người gọi không, không kiểm tra cuộc gọi đến từ đâu, không kiểm tra gì cả. Nó chỉ lấy CPN và hiển thị lên máy người nhận.

Tại sao MSC lại ngây thơ đến vậy?

Thiết kế từ thời "chỉ có nhà mạng mới kết nối được"

Sự tiến hóa của mô hình trust trong viễn thông - từ SS7 trusted nodes đến VoIP boom và STIR/SHAKEN

SS7 được thiết kế trong bối cảnh mà chỉ có một số ít nhà mạng viễn thông lớn, được cấp phép bởi chính phủ, mới có quyền kết nối vào mạng báo hiệu. Giả định cốt lõi rất đơn giản: mọi node trong mạng SS7 đều đáng tin cậy. Không ai giả mạo vì không ai có lý do giả mạo - tất cả đều là tổ chức hợp pháp, chịu quản lý chặt chẽ.

Thập kỷ 1980-1990: SS7 được thiết kế
├── Giả định: Chỉ nhà mạng viễn thông lớn kết nối vào SS7
├── Giả định: Các nhà mạng đều "trusted"
├── Giả định: Không ai giả mạo CPN vì không có incentive
└── Kết quả: KHÔNG CÓ cơ chế xác thực caller ID

Thập kỷ 2000-2010: VoIP bùng nổ
├── SIP trunk cho phép bất kỳ ai kết nối vào PSTN
├── Nhà cung cấp VoIP nhỏ mọc lên hàng nghìn
├── Nhiều nhà cung cấp KHÔNG validate caller ID
├── Giá rẻ: $0.01-0.05 mỗi phút cho route quốc tế
└── Kết quả: Caller ID spoofing thành dịch vụ thương mại

Mô hình tin tưởng này hoạt động tốt trong 20 năm đầu vì barrier to entry rất cao - bạn cần hàng triệu đô để xây hạ tầng viễn thông. Nhưng VoIP xóa bỏ barrier đó. Giờ đây, với vài trăm đô thuê SIP trunk và một server, bất kỳ ai cũng có thể inject cuộc gọi vào mạng PSTN với caller ID tùy ý.

Tưởng tượng bạn thiết kế một tòa nhà với cửa chính chỉ mở bằng thẻ nhân viên. Hàng chục năm sau, ai đó xây thêm cửa phụ không có khóa, nối thẳng vào hành lang bên trong. Mọi người đi qua cửa phụ đều được đối xử như nhân viên chính thức. Đó chính xác là điều VoIP đã làm với mạng viễn thông.


Từ lý thuyết đến thực tế: phân tích một ứng dụng spoofing

Lý thuyết là vậy, nhưng tôi muốn thấy nó hoạt động trong thực tế. Tôi tải một ứng dụng "thay đổi giọng nói khi gọi điện", phân tích cách nó hoạt động, và truy ngược toàn bộ kiến trúc. Những gì tôi tìm thấy nguy hiểm hơn nhiều so với những gì tôi dự đoán.

Kiến trúc: VoIP hoàn toàn, không chạm mạng GSM

Kiến trúc hoàn chỉnh của ứng dụng spoofing - từ app đến PSTN gateway

Ứng dụng này không hề gọi qua mạng di động. Nó sử dụng PJSIP - thư viện VoIP open source - để thiết lập kết nối SIP qua internet. Toàn bộ flow:

Đáng chú ý: ứng dụng không yêu cầu quyền CALL_PHONE - vì nó không gọi qua mạng di động. Mọi cuộc gọi đều đi qua internet, sử dụng SIP trên UDP. Đối với hệ điều hành Android, nó chỉ là một ứng dụng internet bình thường cần quyền micro.

Cách nó hoạt động từng bước

Bước 1: Khi bạn mở app lần đầu, nó đăng ký với backend server qua HTTPS, nhận một mã định danh nội bộ (internal ID).

Bước 2: App gọi API khởi tạo, nhận về cấu hình - bao gồm địa chỉ SIP server và caller ID hiện tại.

Bước 3: Khi bạn muốn đổi số hiển thị, app gửi một POST request đến backend. Server lưu số mới vào database, gắn với ID của bạn. Không có bước xác minh nào - không SMS OTP, không callback, không kiểm tra số có tồn tại hay thuộc về bạn hay không.

Bước 4: Khi gọi, app đăng ký SIP với server rồi gửi SIP INVITE. Server nhận cuộc gọi, tra cứu caller ID đã lưu trong database, rồi tạo SIP INVITE mới đến PSTN gateway với caller ID giả trong header From:P-Asserted-Identity.

Bước 5: PSTN gateway chuyển đổi SIP thành SS7, nhét số fake vào CPN của IAM message, gửi đến tổng đài GSM.

Bước 6: Máy người nhận hiển thị số fake. Nếu số đó có trong danh bạ, tên danh bạ hiện lên. Game over.

Tại sao nó nguy hiểm hơn một "trò vui"

Sau khi reverse engineer xong, tôi phát hiện nhiều vấn đề nghiêm trọng:

Không có validation số fake: Server chấp nhận hầu như mọi số di động toàn cầu. Tôi có thể set caller ID thành số hotline ngân hàng, số cơ quan chính phủ, số người thân của bất kỳ ai. Server chỉ chặn toll-free numbers và một số landline UK - còn lại, mọi thứ đều accepted.

"Xác thực" chỉ là checksum: Toàn bộ hệ thống API của dịch vụ không dùng session token, API key, OAuth, hay bất kỳ cơ chế xác thực nào thực sự. Chúng dùng một phép tính checksum đơn giản từ ID người dùng - bất kỳ ai biết ID đều tính được và gọi API thay bạn.

Voice effects xử lý server-side: Ứng dụng còn có tính năng thay đổi giọng nói - giọng trầm, giọng cao, hiệu ứng âm thanh. Toàn bộ xử lý diễn ra trên server thông qua DTMF signaling. Client gửi mã DTMF (ví dụ *8 cho giọng trầm), server nhận và xử lý audio real-time trước khi forward đến người nhận. Điều này có nghĩa kẻ tấn công không chỉ giả mạo số, mà còn giả mạo được giọng nói ở mức cơ bản.

Câu hỏi then chốt: tại sao năm 2026 rồi mà vẫn thế này?

Caller ID spoofing không phải lỗ hổng mới. Nó tồn tại từ khi VoIP ra đời. Câu hỏi thực sự là: tại sao sau hơn 20 năm, hệ thống viễn thông vẫn chưa sửa được?

STIR/SHAKEN - giải pháp tồn tại nhưng không phổ biến

STIR/SHAKEN framework - cách hoạt động và điểm yếu với cuộc gọi quốc tế

Năm 2019, Mỹ triển khai STIR/SHAKEN - framework xác thực caller ID bằng chữ ký số. Cách nó hoạt động:

  1. Nhà mạng gửi kiểm tra caller ID có thuộc về thuê bao không, rồi ký số vào cuộc gọi với ba mức attestation:
  2. Full (A): Nhà mạng xác nhận đây là thuê bao của họ - số được verify hoàn toàn
  3. Partial (B): Nhà mạng biết nguồn gọi nhưng chưa verify số cụ thể
  4. Gateway (C): Cuộc gọi đến từ international gateway - không thể verify
  5. Nhà mạng nhận kiểm tra chữ ký số, kiểm tra mức attestation, và hiển thị cảnh báo nếu attestation thấp hoặc invalid.

Trên lý thuyết, STIR/SHAKEN giải quyết vấn đề. Nhưng thực tế thì khác xa. Framework này chỉ bắt buộc ở Mỹ và Canada. Phần lớn thế giới - bao gồm Việt Nam, phần lớn châu Á, nhiều nước châu Âu - chưa triển khai. Cuộc gọi quốc tế thường nhận attestation level C (gateway), nghĩa là không thể verify. Và các dịch vụ spoofing chỉ cần route cuộc gọi qua SIP trunk ở quốc gia chưa triển khai STIR/SHAKEN là bypass hoàn toàn.

Hệ sinh thái SIP trunk - ai cho phép spoofing?

Để hiểu tại sao spoofing vẫn tồn tại, bạn cần nhìn vào chuỗi cung ứng VoIP:

Dịch vụ spoofing → SIP Server → SIP Trunk Provider → PSTN Gateway → Mạng GSM

Dịch vụ spoofing không cần sở hữu hạ tầng viễn thông. Họ chỉ cần thuê SIP trunk từ nhà cung cấp cho phép set caller ID tùy ý. Và những nhà cung cấp như vậy không khó tìm - nhiều SIP trunk provider ở Đông Âu, Trung Đông, Đông Nam Á không validate caller ID, không yêu cầu KYC (Know Your Customer), và cho phép set header From: thành bất kỳ số nào.

Giá rẻ đáng ngạc nhiên: khoảng $0.01-0.05 mỗi phút cho route quốc tế. Dịch vụ spoofing mua sỉ, bán lẻ cho người dùng, và thu lợi nhuận. Đó là một mô hình kinh doanh hoàn chỉnh.

Việt Nam - đặc biệt dễ bị tấn công

Tại Việt Nam, tình hình đặc biệt nghiêm trọng vì nhiều yếu tố cộng hưởng:

Chưa có STIR/SHAKEN hoặc tương đương: Nhà mạng Việt Nam hiện tại tin tưởng hoàn toàn caller ID từ international gateway. Không có cơ chế verify, không có cảnh báo cho người dùng.

Caller ID là "bằng chứng danh tính" de facto: Nhiều dịch vụ tại Việt Nam - từ ngân hàng đến cơ quan nhà nước - dùng số điện thoại như primary identifier. Khi ai đó gọi từ số hotline ngân hàng, phản xạ tự nhiên là tin tưởng.

Văn hóa nghe điện thoại: Người Việt có thói quen nghe điện thoại từ số lạ (vì shipper, grab, đặt hàng...). Kết hợp với caller ID "chính xác", khả năng phân biệt cuộc gọi giả gần như bằng không.

Ít awareness: So với Mỹ - nơi FCC đã có chiến dịch cảnh báo robocall/spoofing nhiều năm - người dùng Việt Nam phần lớn chưa biết caller ID có thể bị giả mạo.

Từ spoofing đến lừa đảo: bức tranh lớn hơn

Bản thân caller ID spoofing không phải lừa đảo. Nó là một công cụ. Nhưng khi kết hợp với social engineering, nó trở thành vũ khí cực kỳ hiệu quả.

Hãy nghĩ về kịch bản này: ai đó gọi bạn từ số hotline ngân hàng bạn đang dùng. Máy bạn hiển thị đúng tên "Ngân hàng XYZ" trong danh bạ. Giọng nói chuyên nghiệp, thông báo "phát hiện giao dịch bất thường 50 triệu từ tài khoản". Bạn hoảng. Họ yêu cầu xác minh bằng OTP. Bạn đọc OTP - và tiền biến mất.

Kịch bản này không phải giả tưởng. Lừa đảo qua điện thoại giả mạo số ngân hàng đã xảy ra nhiều lần tại Việt Nam. Và với các ứng dụng spoofing có sẵn trên app store, barrier to entry cho kẻ tấn công gần như bằng không.

Ngoài vishing ngân hàng, caller ID spoofing còn enable nhiều kịch bản nguy hiểm khác: giả mạo số sếp để yêu cầu chuyển tiền gấp (biến thể BEC qua phone), gắn tội cho người khác bằng cuộc gọi đe dọa (call log sẽ hiển thị số người bị gắn tội), hay thậm chí bypass hệ thống xác thực dùng caller ID làm factor - bất kỳ dịch vụ nào dùng "Call to Verify" đều vulnerable nếu không có STIR/SHAKEN.

Phòng thủ - khi hệ thống không bảo vệ bạn, bạn phải tự bảo vệ mình

Cho bạn - người dùng điện thoại mỗi ngày

Quy tắc số một: không bao giờ tin tưởng caller ID. Ngân hàng gọi hỏi OTP? Gác máy, gọi lại số chính thức từ website. Sếp gọi xin chuyển tiền gấp? Confirm qua kênh khác - Zalo, tin nhắn, gặp trực tiếp.

Bật 2FA không dùng phone call. Authenticator app (Google Authenticator, Authy) hoặc hardware key (YubiKey) an toàn hơn SMS OTP nhiều lần. Nếu dịch vụ nào chỉ có SMS OTP, đó là dịch vụ cần cải thiện bảo mật.

Cho doanh nghiệp và ngân hàng

Ngừng dùng caller ID như authentication factor. Caller ID không phải bằng chứng danh tính - nó là một lời tự khai không được verify. Chuyển sang app-based push notification cho OTP. Triển khai voice biometrics nếu cần xác thực qua giọng nói. Và quan trọng nhất: educate nhân viên và khách hàng rằng "ngân hàng không bao giờ gọi hỏi OTP".

Cho nhà mạng viễn thông Việt Nam

Triển khai STIR/SHAKEN hoặc framework tương đương. Validate caller ID từ international SIP trunk. Flag cuộc gọi có caller ID không khớp với network origin. Implement AI-based fraud detection trên call patterns bất thường. Đây không phải việc dễ, nhưng là việc cần làm - trước khi thiệt hại trở nên không thể chấp nhận được.

Thay lời kết

Caller ID spoofing không phải bug. Nó là hệ quả tất yếu của một hệ thống được thiết kế trên nền tảng trust, khi trust đó không còn tồn tại. SS7 ra đời khi chỉ có vài chục nhà mạng lớn trên thế giới, ai cũng biết mặt nhau. VoIP phá vỡ giả định đó bằng cách cho phép bất kỳ ai với vài trăm đô trở thành "nhà mạng" - nhưng giao thức báo hiệu không bao giờ được thiết kế lại để phản ánh thực tế mới.

Kết quả: năm 2026, bạn nhận cuộc gọi từ "ngân hàng", và bạn không có cách nào - tuyệt đối không có cách nào từ phía điện thoại - để biết đó có phải ngân hàng thật không.

Lần tới khi điện thoại reo và màn hình hiển thị một cái tên quen thuộc, hãy nhớ: cái tên đó có thể là giả. Số điện thoại đó có thể là giả. Và hệ thống viễn thông không bảo vệ bạn khỏi điều đó. Câu hỏi duy nhất đáng hỏi không phải "ai gọi?", mà là "họ muốn gì?"