Adrress Resolution Protocol

  1. Tầng giao thức: 2.5 (nằm giữa tầng network và tầng data link).
  2. Hình thức tấn công: ARP cache poisoning.

Adrress Resolution Protocol (ARP) là giao thức giúp tìm địa chỉ MAC dựa trên địa chỉ IP của một interface bất kỳ. Giao thức này tương tự với DNS vì đều phân giải thành một địa chỉ nào đó. Tuy nhiên, giao thức ARP chỉ có thể được sử dụng trong mạng LAN.

Minh họa:

Mỗi node mạng sẽ có một bảng gọi là ARP table với ba cột giá trị: IP, MAC và TTL (Time To Live). TTL là thời gian mà thông tin này tồn tại trong ARP Table.

How Does it Work?

Request and Reply

Xét sơ đồ mạng sau:

Khi host A muốn biết địa chỉ MAC của host B, host A sẽ gửi một gói tin ARP request đến địa chỉ broadcast để phân giải địa chỉ IP của host B.

Gói tin ARP request sẽ có những thông tin sau:

FieldValue
Hardware typeEthernet (1)
Protocol typeIPv4 (0x0800)
Hardware size6
Protocol size4
Opcode1
Sender MAC address00:53:ff:ff:aa:aa
Sender IP address10.0.0.11
Target MAC address00:00:00:00:00:00
Target IP address10.0.0.22

Với:

  • Hardware type là loại phần cứng, Ethernet có loại là 1.
  • Protocol type là loại giao thức, IPv4 có loại là 0x0800 (2048).
  • Hardware size là kích thước địa chỉ phần cứng, Ethernet có kích thước là 6 byte.
  • Protocol size là kích thước địa chỉ giao thức, IPv4 có kích thước là 4 byte.
  • Opcode: 1 cho biết đây là gói tin ARP request.
  • Còn lại là địa chỉ MAC và địa chỉ IP của bên bên gửi và bên nhận. Trong trường hợp gói tin là ARP request, địa chỉ MAC đích là địa chỉ broadcast.

Khi B nhận được gói tin ARP request thì sẽ phản hồi lại A địa chỉ MAC của nó bằng gói tin ARP reply, bao gồm những thông tin sau:

FieldValue
Hardware typeEthernet (1)
Protocol typeIPv4 (0x0800)
Hardware size6
Protocol size4
Opcode2
Source MAC address00:53:ff:ff:bb:bb
Source IP address10.0.0.22
Target MAC address00:53:ff:ff:aa:aa
Target IP address10.0.0.11

Với opcode là 2 cho biết đây là gói tin ARP reply. Ngoài ra, gói tin ARP reply là gói tin unicast (gửi đến một host cụ thể).

ARP Caching

Sau khi có được địa chỉ MAC của host B thì host A sẽ lưu nó vào ARP table.

Important

Host B cũng sẽ lưu ánh xạ địa chỉ IP - MAC của host A vào ARP table của nó. Việc này giúp giảm thiểu độ trễ gây ra bởi việc học địa chỉ MAC khi host B cần gửi gói tin cho host A.

Tham khảo: Why does the receiver of an ARP request updates its cache table - Network Engineering Stack Exchange.

Cụ thể hơn, hàm arp_process() trong hiện thực của giao thức ARP ở file net/ipv4/arp.c (Linux Kernel) có đoạn comment sau:

Process entry.  The idea here is we want to send a reply if it is a request for us or if it is a request for someone else that we hold a proxy for.  We want to add an entry to our cache if it is a reply to us or if it is a request for our address. (The assumption for this last is that if someone is requesting our address, they are probably intending to talk to us, so it saves time if we cache their address.  Their address is also probably not in our cache, since ours is not in their cache.)
 
Putting this another way, we only care about replies if they are to us, in which case we add them to the cache.  For requests, we care about those for us and those for our proxies.  We reply to both, and in the case of requests for us we add the requester to the arp cache.

Có thể thấy, nếu là request gửi đến host hoặc proxy của host thì sẽ thêm địa chỉ của bên gửi vào ARP table.

The Algorithm

Sau đây là lời giải thích và mã giả xử thuật toán lý gói tin ARP, được trích dẫn từ RFC-826:

Quote

When an address resolution packet is received, the receiving Ethernet module gives the packet to the Address Resolution module which goes through an algorithm similar to the following. Negative conditionals indicate an end of processing and a discarding of the packet.

?Do I have the hardware type in ar$hrd?
Yes: (almost definitely)
  [optionally check the hardware length ar$hln]
  ?Do I speak the protocol in ar$pro?
  Yes:
    [optionally check the protocol length ar$pln]
    Merge_flag := false
    If the pair <protocol type, sender protocol address> is
        already in my translation table, update the sender
        hardware address field of the entry with the new
        information in the packet and set Merge_flag to true. 
    ?Am I the target protocol address?
    Yes:
      If Merge_flag is false, add the triplet <protocol type,
          sender protocol address, sender hardware address> to
          the translation table.
      ?Is the opcode ares_op$REQUEST?  (NOW look at the opcode!!)
      Yes:
        Swap hardware and protocol fields, putting the local
            hardware and protocol addresses in the sender fields.
        Set the ar$op field to ares_op$REPLY
        Send the packet to the (new) target hardware address on
            the same hardware on which the request was received.

Notice that the <protocol type, sender protocol address, sender hardware address> triplet is merged into the table before the opcode is looked at. This is on the assumption that communcation is bidirectional; if A has some reason to talk to B, then B will probably have some reason to talk to A. Notice also that if an entry already exists for the <protocol type, sender protocol address> pair, then the new hardware address supersedes the old one. Related Issues gives some motivation for this.

Đoạn trích trên cho ta biết cách mà ARP xử lý các entry bị trùng: nếu đã có một cặp <loại giao thức - địa chỉ giao thức> tồn tại trong ARP table, địa chỉ phần cứng ở trong ARP table sẽ được cập nhật bằng giá trị ở trong ARP request (câu lệnh If đầu tiên). Ngược lại, thêm vào một bộ ba bao gồm loại giao thức, địa chỉ giao thức và địa chỉ phần cứng vào ARP table (câu lệnh If thứ hai).

Việc xử lý các gói tin ARP reply mà không được yêu cầu (không có gói tin ARP request tương ứng, hay còn gọi là unsolicited ARP) tùy thuộc vào hệ điều hành. Một vài hệ điều hành sẽ cập nhật ARP table còn một số khác sẽ hủy gói tin1.

Có thể dùng tunable2 net.ipv4.conf.interface.arp_accept thuộc (sysctl) để cho phép tạo ARP table entry khi host nhận gói tin unsolicited ARP.

ARP Cache Poisoning (ARP Spoofing)

Cho sơ đồ mạng sau:

Khi Switch0 muốn phân giải địa chỉ IP của PC1 thành địa chỉ MAC, nó sẽ broadcast gói tin ARP request. PC1 sẽ phản hồi lại bằng gói tin ARP reply có nội dung như sau:

  • Sender IP address: glibc.
  • Sender MAC address: GLIBC_TUNABLES.

Sau đó, Switch0 sẽ thêm một entry có địa chỉ IP là 192.168.1.1 và địa chỉ MAC là 00:0C:CF:58:36:60 vào ARP table.

Xét ví dụ trên, giả sử PC2 muốn đóng giả làm PC1. Khi nhận được gói tin ARP request, nó sẽ gửi cho Switch0 một gói tin ARP reply với nội dung như sau:

  • Sender IP address: 192.168.1.1 (địa chỉ IP của PC1).
  • Sender IP address: 00:0C:CF:58:36:60 (địa chỉ MAC của PC2).

Lúc này, bảng MAC có thể có hai entry cùng địa chỉ IP nhưng khác địa chỉ MAC:

  • 192.168.1.1 - 00:D0:BC:02:D6:C8
  • 192.168.1.1 - 00:0C:CF:58:36:60

Đối với một số cách thức phân giải của switch, chẳng hạn như phân giải động (dynamic resolution), switch sẽ dùng entry mới nhất nếu có hai entry cùng địa chỉ IP. Trong trường hợp này, nó sẽ dùng entry giả mạo được gửi từ PC2.

Lúc này, tất cả các gói tin có địa chỉ IP đích là 192.168.1.1 đều được chuyển đến PC2.

Gratuitous ARP

Là một biến thể của giao thức ARP giúp phát hiện sự trùng lặp IP trong mạng nội bộ.

Cụ thể, để một host A biết được rằng có host nào khác sử dụng trùng IP với nó hay không, nó sẽ gửi một gói tin ARP request (cũng có thể là reply) nhằm phân giải địa chỉ IP của chính nó. Nếu không có sự xung đột IP xảy ra, sẽ không có gói tin ARP reply nào được gửi lại.

Minh họa:

Gói tin gratuitous ARP có một số tính chất như sau:

  • Địa chỉ IP nguồn và địa chỉ IP đích đều là của host gửi gói tin.
  • Giá trị MAC đích trong gói tin ARP và trong Ethernet đều là địa chỉ broadcast.

Gói tin gratuitous ARP còn được dùng để quảng bá địa chỉ IP và địa chỉ MAC của một host cho toàn bộ network, đặc biệt là khi có sự thay đổi địa chỉ xảy ra.

list
from outgoing([[ARP]])
sort file.ctime asc

Resources

Footnotes

  1. tham khảo networking - Will all ARP Replies update the ARP Table? - Server Fault

  2. xem thêm [[CVE-2023-4911 (Looney Tunables)#modifying-00d0bc02d6c8-behaviour-via-19216811|Modifying 00:D0:BC:02:D6:C8 Behaviour via 192.168.1.1]]