Tầng 2 của mạng: khu tập thể không ai khoá cửa và 5 đòn tấn công vẫn sống năm 2026
ARP spoofing, MAC flooding, VLAN hopping, STP takeover, rogue DHCP - tại sao tầng Data Link vẫn là chỗ dễ bị mò nhất trong enterprise LAN, kể từ một switch phòng lab tới một datacenter Fortune 500.

Hôm trước trong phòng lab IAHN, một sinh viên cắm laptop vào switch của bàn, mở browser, gõ "google.com" và... không vào được. Em đó hỏi mình: "Thầy ơi máy em vừa được mạng xong, sao một lúc lại mất?"
Mình ngồi xuống, mở arp -a. Cái dòng làm mình khựng lại không phải là "không có gateway", mà ngược lại: gateway 192.168.x.1 đang được map vào một MAC address không phải của router. Một MAC đầu là b8:27:eb:... - OUI của Raspberry Pi.
Có ai đó trong phòng đang chạy ettercap. Có thể là vô tình - một bài lab tuần trước - có thể là cố ý. Mình không bao giờ biết chắc. Nhưng cú ARP cache bị overwrite ngay trước mắt mình hôm đó là lý do mình ngồi viết bài này.
Tầng Data Link, hay Layer 2, là tầng mà giáo trình hay dạy "đóng gói packet thành frame, dùng MAC address để giao hàng cục bộ." Nghe chán. Mỗi lần lên lớp tới slide đó, mắt sinh viên cũng đờ đẫn. Nhưng nếu nhìn từ góc một kẻ tấn công đang ngồi cùng tầng 2 với bạn, mọi thứ thú vị hơn nhiều. Tầng 2 là tầng được thiết kế cho một thế giới mà ai cũng tin nhau. Mà thế giới đó không bao giờ tồn tại.
Bài này mình kể 5 đòn tấn công kinh điển ở tầng 2, kèm cơ chế kỹ thuật sâu hơn slide, và lý do mà các lớp phòng thủ "đẹp trên giấy" như DAI hay Port Security vẫn bị bypass thường xuyên.
1. ARP - giao thức tin người vô điều kiện
Trước khi nói về ARP spoofing, bạn cần hiểu vì sao ARP tồn tại và vì sao nó được thiết kế ngây thơ tới vậy.
Khi máy của bạn muốn gửi packet IP tới 192.168.1.1, switch không hiểu IP - switch chỉ biết MAC. Layer 3 cần một cách để hỏi "ai đang cầm IP đó, MAC là gì?" Câu trả lời là RFC 826, năm 1982 [1]. Mã ngắn, đẹp:
- Host gửi ARP Request dạng broadcast: "ai có IP X, trả lời tôi đi."
- Host có IP X trả lời ARP Reply unicast: "tôi đây, MAC là Y."
- Cache lại 60 giây tới vài phút, đỡ phải hỏi lại.
Khi RFC 826 được viết, internet là khoảng 200 host của một số trường đại học Mỹ. Không có khái niệm "kẻ tấn công cắm vào cùng switch." Vì vậy ARP có ba đặc tính mà ngày nay rất đáng để khai thác:
- Không có authentication. Bất cứ ai cũng có thể trả lời.
- Last reply wins. Reply tới sau đè reply tới trước.
- Reply không yêu cầu request. Cái này tên là "gratuitous ARP" - bạn có thể chủ động hét "tôi là IP X, MAC là Y" vào không gian mà chẳng ai hỏi, và mọi máy nghe được sẽ vui vẻ cập nhật cache.
Ba thứ này ghép lại, ARP spoofing là chuyện hiển nhiên.

Kẻ tấn công gửi liên tục hai mệnh đề:
- Với victim: "192.168.1.1 (gateway) đang ở MAC
CC:CC" (thực ra là MAC attacker) - Với gateway: "192.168.1.10 (victim) đang ở MAC
CC:CC"
Cả hai bên đều tin. Họ tin vì ARP nói thế, và họ không có lựa chọn nào khác trừ khi admin đã bật DAI. Từ giờ, mọi gói tin từ victim ra internet, từ internet về victim, đều đi xuyên qua máy attacker. Đây là MITM cổ điển nhất trong sách giáo khoa.
Một tool như bettercap, viết bằng Go, chỉ cần một dòng:
sudo bettercap -iface eth0 -eval "set arp.spoof.targets 192.168.1.10; arp.spoof on; net.sniff on"
Là xong. Trong 10 giây bạn thấy traffic HTTP plaintext, cookie, đôi khi cả Basic Auth nếu user còn dùng app cổ. Nếu attacker thêm set http.proxy.sslstrip true, người dùng gõ "facebook.com" trên trình duyệt sẽ thấy facebook plain HTTP - không có khoá xanh - và nhiều người không để ý. Modern browser bật HSTS preload làm việc này khó hơn, nhưng không phải app nào cũng có HSTS, nhất là internal portal của doanh nghiệp.
Cái mà slide thường không nói: ARP spoofing không cần priv. Không cần root nếu bạn raw socket được, nhưng kể cả không root, có cả userland tool dùng RAW packet qua pcap. Và quan trọng hơn, ARP spoofing không có dấu vết rõ ràng ở Layer 3 trở lên. Application không thấy gì lạ. SSL/TLS thì có thể chống, nhưng chỉ chống được phần content - metadata, danh sách host bạn đang truy cập, vẫn lộ.
Cách phòng thật sự: Dynamic ARP Inspection (DAI). Switch kiểm tra từng ARP packet: IP-to-MAC binding có khớp với bảng DHCP Snooping không? Không khớp -> drop. Hoặc bật static ARP entry trên các thiết bị critical. Nhưng DAI phụ thuộc DHCP Snooping, và một số môi trường (data center có static IP nặng) phải duy trì binding table bằng tay - cực kỳ dễ sai.
2. CAM table overflow - khi switch quên cách làm switch
Switch khác hub ở một điểm duy nhất: switch ghi nhớ MAC nào ở port nào, và unicast frame chỉ đi tới port đúng. Cái bảng ghi nhớ đó tên là CAM table (Content Addressable Memory). Mỗi entry trông như:
MAC | Port | VLAN | Age
00:1A:2B:3C:4D:5E | Gi1/3| 10 | 42s
Vấn đề là CAM table có giới hạn. Trên Cisco Catalyst 2960 mà các phòng lab hay dùng, max là 8,192 entries [2]. Trên Catalyst 6500 cao cấp hơn thì khoảng 132K [3]. Khi đầy, switch không thể học MAC mới, và không thể tra cứu MAC mới đó được. Hành vi mặc định khi không tra ra được: flood ra toàn bộ port trong VLAN. Switch trở lại làm hub [4].
macof, một tool trong dsniff suite từ 1999, chỉ làm đúng một việc: bắn frame với MAC nguồn ngẫu nhiên hết tốc lực.
sudo macof -i eth0
Tốc độ macof điển hình khoảng 8,000 frame/giây [3]. Với 8,192 entries, một CAM table của Catalyst 2960 lấp đầy trong khoảng một giây. Trong 5 phút - tức là một lần aging timeout - attacker đã bắn xong vài triệu MAC giả, dư sức giữ bảng trong trạng thái đầy liên tục.

Nhưng macof không phải vũ khí im lặng. Nó vô cùng ồn. Bất kỳ NetFlow/sFlow collector nào, hay đơn giản chỉ một switch có monitoring SNMP, đều thấy port của attacker đang bơm khủng khiếp. Một bộ IDS với chữ ký "high MAC churn on single port" sẽ kêu trong vòng giây. Vậy tại sao attack này vẫn được kể? Vì rất nhiều mạng SMB và phòng lab giáo dục không có monitoring. Không ai nhìn vào counter của switch. Tới lúc bị nghe lén xong xuôi, mới biết.
Cách phòng: Port Security. Một dòng config:
interface GigabitEthernet0/1
switchport port-security
switchport port-security maximum 2
switchport port-security violation shutdown
Switch chỉ chấp nhận tối đa 2 MAC trên port này. Quá - shutdown port. Macof vừa bắn 10,000 MAC từ một port là port đó tự tắt trong 1 giây. Đơn giản, hiệu quả. Nhưng phần lớn switch trong các trường học, quán cà phê, văn phòng nhỏ, không cấu hình port security. Mặc định Cisco không bật. Mặc định mọi access port đều vô tư học MAC.
3. VLAN hopping - bức thư hai phong bì
Đây là attack mình thấy nhiều người dạy CCNA giảng cho có rồi nhảy qua, vì nó khó vẽ hình. Nhưng nó là một trong những đòn elegant nhất ở Layer 2.
VLAN sinh ra để chia một switch vật lý thành nhiều mạng logic. Máy ở VLAN 10 (Sales) không thấy máy ở VLAN 20 (Finance). Tag 802.1Q được chèn vào header frame để switch biết frame thuộc VLAN nào. Khi frame đi qua trunk port (đường nối hai switch), tag đi cùng. Khi frame tới access port (cắm vào máy người dùng), tag bị strip.
Có một ngoại lệ: native VLAN. Theo chuẩn 802.1Q, frame thuộc native VLAN của trunk không gắn tag khi đi qua trunk [5]. Lý do lịch sử: tương thích ngược với switch cổ không hiểu tagging. Mặc định native VLAN là VLAN 1.
Đây chính là cái khe.
Attacker, ngồi ở access port VLAN 1 (native), tự tay dựng một frame Ethernet với hai tag 802.1Q lồng vào nhau:
[Eth header] [outer tag: VLAN 1] [inner tag: VLAN 20] [payload]
Switch 1 nhìn vào, thấy outer tag là VLAN 1 - trùng native VLAN. Theo chuẩn, nó strip outer tag trước khi forward qua trunk. Frame lên trunk còn lại:
[Eth header] [tag: VLAN 20] [payload]
Switch 2 ở đầu trunk bên kia đọc frame, thấy tag VLAN 20, forward nó tới các port thuộc VLAN 20. Attacker đã đặt được frame vào VLAN Finance mà không cần đi qua router, không cần ACL nào cho phép.

Có một điều quan trọng: đây là attack một chiều. Reply từ victim VLAN 20 quay về sẽ không có double tag, nó bị strip ở trunk như frame VLAN 20 bình thường và không thể tới được port của attacker. Vậy tại sao vẫn dùng? Ba kịch bản:
- DoS: Push một frame broadcast với payload độc vào VLAN target. Một loop frame, một storm.
- Cross-VLAN ARP poisoning: Bơm ARP reply giả vào VLAN khác. Victim trong VLAN khác giờ có ARP cache hỏng. Attacker không nhận được reply nhưng vẫn vô hiệu hoá VLAN đó.
- Push payload đến một service: Nếu có endpoint trong VLAN target tự xử lý packet đến (như syslog UDP, SNMP trap fake), một-chiều là đủ.
Phòng: đổi native VLAN sang một VLAN không ai dùng (ví dụ VLAN 999), và bật tagging cho native VLAN (vlan dot1q tag native). Hai dòng cấu hình thôi. Nhưng vô vàn switch enterprise vẫn để native là VLAN 1 vì sợ break ứng dụng cũ.
Anh em VLAN hopping còn một biến thể nữa là switch spoofing qua DTP. Cisco có protocol tên Dynamic Trunking Protocol, bật mặc định trên Catalyst access port. Nó tự đàm phán: nếu device đầu kia "có vẻ là switch", port tự bật trunk. Attacker dùng yersinia giả là switch:
sudo yersinia -G # GUI
# chọn DTP > Send DTP packet > set status: Trunk
Switch chuyển access port thành trunk port. Attacker giờ thấy traffic của tất cả VLAN đi qua trunk đó. Đây là kiểu hack mà nhiều penetration test report vẫn ghi nhận năm 2024-2025 trong các doanh nghiệp chưa bật switchport mode access + switchport nonegotiate.
4. STP root takeover - kẻ tự xưng là vua
Spanning Tree Protocol (STP) là cơ chế tránh loop ở Layer 2. Khi nhiều switch nối với nhau thành topology có vòng, STP chạy thuật toán bầu một switch làm "Root Bridge", rồi block một số link để cây thành tree. Bầu cử dựa trên Bridge ID - một số 8 byte gồm:
- 2 byte: Priority (mặc định 32768)
- 6 byte: MAC address
Bridge ID nhỏ thắng. Cái mà gọi là "superior BPDU" trong sách giáo khoa, đơn giản là một BPDU với Bridge ID nhỏ hơn.
Lỗ hổng: BPDU không có authentication. Bất kỳ thiết bị nào cắm vào switch port, nếu gửi BPDU với priority = 0 (hoặc bất kỳ giá trị thấp hơn root hiện tại), sẽ được mọi switch coi là root mới và tự bầu lại cây.
yersinia lại là tool quen mặt. Theo Cisco Press, yersinia có thể bơm hàng nghìn BPDU/giây, đủ làm Catalyst 6500 Supervisor Engine 720 chạy IOS 12.2(18)SXF leo lên 99% CPU [6]. Mà thực ra không cần flood - chỉ cần một BPDU superior duy nhất là attacker trở thành root.

Khi attacker thành Root Bridge, hai chuyện xảy ra:
- Re-convergence: Toàn mạng dừng forwarding 30-50 giây để STP tính lại. Hoặc gần như tức thời nếu chạy Rapid STP. Trong thời gian đó, mạng có thể loop, có thể blackhole, người dùng thấy "internet chậm."
- Path redirect: Sau convergence, một số đường tốt nhất giờ đi qua port của attacker. Nếu attacker có hai NIC và bridge giữa hai segment, traffic giữa các phần mạng đi xuyên qua attacker. MITM trên scale lớn hơn nhiều so với ARP spoofing.
Một biến thể độc hơn: "BPDU oscillation" - attacker bơm superior BPDU, rồi vài giây sau bơm BPDU rút lại (priority cao lên), rồi lại superior. Mạng liên tục re-converge. CPU switch leo cao. Network thực sự chết, kiểu DoS Layer 2 đáng sợ vì không có gói tin lớn nào - chỉ vài byte BPDU mỗi giây.
Phòng: BPDU Guard + Root Guard, cả hai chỉ là một dòng config [7]:
interface GigabitEthernet0/1
spanning-tree portfast
spanning-tree bpduguard enable
Cisco gọi đây là "PortFast BPDU Guard Enhancement", có từ IOS 12.x. Port nào nhận BPDU trong khi được khai báo PortFast (port edge nối máy người dùng) là tự shutdown ngay lập tức. Đơn giản, hiệu quả. Nhưng lại là một thứ tốn 30 giây gõ mà nhiều admin quên hoặc lười.
5. DHCP starvation và rogue DHCP - thay tay người gác cổng
Đây là chain attack. Hai bước.
Bước 1: DHCP starvation. Attacker bơm hàng nghìn DHCP DISCOVER với MAC nguồn giả. DHCP server cấp IP cho mỗi MAC, IP pool cạn nhanh chóng. Lease time mặc định 8 ngày - nghĩa là phải đợi 8 ngày những IP đó mới release, hoặc admin reset bằng tay. Tool điển hình: dhcpig, hoặc lại là yersinia. Trên một subnet /24 (254 host), starvation hoàn tất trong dưới 1 giây.
Bước 2: Rogue DHCP server. Attacker bật DHCP server giả trên máy mình. Vì DHCP server hợp lệ đã hết IP, mọi máy mới (hoặc máy đang xin renew) sẽ nhận lease từ rogue server. Rogue server trả về:
IP: 192.168.1.123
Subnet: 255.255.255.0
Gateway: 192.168.1.66 <- IP của attacker
DNS: 192.168.1.66 <- DNS của attacker
Victim giờ gửi mọi packet ra internet qua attacker. Không cần ARP spoofing, không cần STP attack. Người ta tự đưa traffic cho attacker vì DHCP nói thế.
Nguy hiểm hơn ARP spoofing ở chỗ:
- Cả gateway lẫn DNS đều thuộc attacker - DNS hijack đi kèm, phishing dễ dàng.
- Persistent: lease 8 ngày. ARP spoof phải duy trì liên tục (re-send mỗi 1-2 giây), nhưng DHCP poison thì cài đặt một lần, dùng nhiều ngày.
Một điểm ít người để ý: DHCP starvation cũng ồn như macof - hàng nghìn DISCOVER mỗi giây từ một MAC OUI ngẫu nhiên là chữ ký quá rõ. Nhưng rogue DHCP đơn thuần (không starvation đi trước) thì im như tờ. Nếu attacker chỉ bật DHCP server giả và đợi máy mới join, traffic phát ra chỉ là vài byte OFFER khi cần. Race condition giữa rogue server và server hợp lệ là một xác suất - rogue có advantage nếu cắm gần victim hơn (latency thấp hơn). Trong môi trường wifi guest hay hội nghị, attacker thường thắng.
Phòng: DHCP Snooping. Switch phân biệt port "trusted" (có DHCP server hợp lệ) và port "untrusted" (port người dùng). DHCP OFFER/ACK chỉ được chấp nhận từ port trusted; từ port untrusted bị drop ngay. Đồng thời switch tự build bảng (MAC | IP | port | VLAN | lease) - bảng này chính là input của DAI ở mục 1.
ip dhcp snooping
ip dhcp snooping vlan 10,20
interface GigabitEthernet0/24
ip dhcp snooping trust ! port nối DHCP server
Đây là lý do mình hay nói DHCP Snooping là "nền móng" của Layer 2 defense - nếu không có nó, DAI không có binding để dựa vào, IP Source Guard cũng không.

Tại sao 802.1X và MACsec chưa giải quyết hết
Có một câu hỏi mọi người hay hỏi: "Chẳng phải 802.1X (port-based NAC) đã giải quyết Layer 2 security rồi sao? Hay MACsec mã hoá hop-by-hop ấy?"
Steel-man: "802.1X và MACsec đã giải quyết được Layer 2 security, không cần các lớp phòng cũ nữa"
Đúng là 802.1X và MACsec là bước tiến lớn, và mình không có ý chê. Nhưng cả hai đều có bypass đã được công bố, và trong thực tế đa số mạng triển khai không đủ chặt để chặn được attacker có chuẩn bị.
802.1X yêu cầu máy authenticate (qua EAP) trước khi switch port forward bất kỳ traffic gì. Attacker cắm laptop vào sẽ bị từ chối. Nhưng ba bypass thường gặp:
- EAP method yếu: Nhiều mạng dùng EAP-MD5 hay PEAP với credential dễ đoán. Hashcat trong vài giờ ra.
- Bridge attack: Attacker đặt một bridge giữa máy hợp pháp đã auth và switch. Máy hợp pháp gửi EAPOL-Start, sau đó attacker piggyback traffic qua bridge. Đã được trình bày tại Black Hat USA 2018 [8].
- MAC Authentication Bypass (MAB): Nhiều môi trường cho phép thiết bị không nói EAP (máy in, IP phone) auth bằng MAC. Spoof MAC máy in là vào.
MACsec (IEEE 802.1AE) mã hoá frame hop-by-hop. Nghe an toàn. Nhưng VLAN tag thường được đặt ngoài MACsec header (configurable) - tức tag không được authenticate. Double tagging vẫn có thể chen vào, dù bị giới hạn hơn. Trong môi trường có provider bridges (PB) hoặc backbone bridges (PBB), MACsec không bảo vệ toàn bộ chain - có chỗ "decap rồi encap" mà attacker có thể chen.
Nói cách khác: Layer 2 security là chain, không phải single tool. Bạn cần kết hợp DHCP Snooping + DAI + Port Security + BPDU Guard + Root Guard + DTP off + nonegotiate + 802.1X + (lý tưởng) MACsec. Thiếu một mắt là cả chain yếu đi.
Một điều mình vẫn không hiểu
Layer 2 attacks đã được nghiên cứu kỹ từ đầu những năm 2000. Yersinia ra đời 2005. Cisco Press xuất bản "LAN Switch Security" 2007 [6]. DAI có trên Cisco IOS từ 2005. BPDU Guard có từ 2003. Đây là kiến thức 20 năm tuổi.
Vậy mà mỗi lần mình hỏi sinh viên cuối kỳ, hoặc đọc pentest report của một bệnh viện, một trường đại học, đôi khi cả một ngân hàng cấp trung - vẫn thấy port access mặc định DTP auto, vẫn thấy native VLAN là 1, vẫn thấy DHCP Snooping tắt, vẫn thấy show port-security rỗng.
Mình từng nghĩ đây là vấn đề thiếu kiến thức. Nhưng càng nhiều năm dạy mạng, mình càng thấy không phải. Sinh viên năm 3 CCNA đã biết tên DAI. Người admin SSH vào switch hôm đó cũng biết. Chỉ là bật chúng lên thì có rủi ro break thứ gì đó đang chạy, và không bật thì hôm nay không ai chết.
Cho nên Layer 2 attacks vẫn sống, không phải vì chúng tinh vi, mà vì chúng không nguy hiểm đủ để justify cái rủi ro của một dòng cấu hình lúc 3 giờ chiều thứ Sáu. Cho tới khi nó nguy hiểm thật.
Mình vẫn chưa tìm ra cách diễn đạt sao để sinh viên - hoặc admin tương lai của họ - thấy được khoảng cách đó. Nếu bạn có cách kể câu chuyện này hay hơn mình, kéo lên hộp comment giúp mình.
Bình
Tài liệu tham khảo
[1]
David C. Plummer, "RFC 826: An Ethernet Address Resolution Protocol", IETF / DARPA, 1982-11 - Bản gốc thiết kế ARP. Đọc để hiểu vì sao protocol đơn giản tới mức không có authentication - bối cảnh internet 200 host của các trường đại học Mỹ
[2]
"Catalyst 2960 and 2960-S Switches Software Configuration Guide", Cisco Systems - Spec chính thức Catalyst 2960: MAC address table 8192 entries
[3]
"CAM Table Overflow Attack Mitigation on Cisco Switches", CellStream, 2014-06 - Benchmark macof: ~8000 frame/giây, CAM table Catalyst 6500 ~132K entries. Source thực tế thay cho measurement không rõ ràng
[4]
"MAC flooding", Wikipedia - Reference cho hành vi switch khi CAM table đầy (fail-open thành hub), tool macof từ dsniff suite
[5]
"VLAN hopping", Wikipedia - Giải thích cơ chế double tagging và switch spoofing qua DTP tương đối đầy đủ, có dẫn nguồn
[6]
Eric Vyncke, Christopher Paggen, "LAN Switch Security: What Hackers Know About Your Switches", Cisco Press, 2007-09 - Sách reference chính cho Layer 2 attacks. Chương 3 có demo Yersinia chi tiết, benchmark BPDU flood trên Catalyst 6500 Supervisor Engine 720
[7]
"Spanning Tree PortFast BPDU Guard Enhancement", Cisco Systems - Doc số 10586-65. Giải thích chi tiết BPDU Guard và Root Guard, hai cơ chế phòng STP takeover khác nhau ra sao
[8]
Ali Abbasi, Thorsten Holz, Emmanuele Zambon, Sandro Etalle, "Bypassing Port Security: Defeating MACsec and 802.1x-2010", Black Hat USA, 2018-08 - Paper trình bày bridge attack giữa máy hợp pháp đã auth và switch. Minh hoạ MACsec/802.1X-2010 không phải viên đạn bạc cho Layer 2 security