The short answer is yes, duplicates are possible, but the probability is low in a given area.
Most of the information here comes from ICAO Annex 10 volume III - Communication Systems.
ICAO 24-bit address overall
Aircraft, aerodrome vehicles, surface obstacles and Mode S surface equipments used for surveillance and radar monitoring can be assigned an address.
An aircraft is assigned a unique address. Surface vehicles and devices can share the same address, provided they are distant by more than 1,000km.
The address is assigned e.g. to the aircraft. It is not assigned to a particular equipment, all equipments aboard the aircraft use the same ICAO address (1090 ES and 978 UAT).
Valid addresses are all combinations of 24 bits, excluding all 0s and all 1s.
A TIS-B ground station can temporarily identify a mode A/C aircraft without address with a pseudo-address made of the 12 bits of the squawk code and 12 random bits assigned to the track. The station uses this pseudo-address to identify the aircraft it is talking about in its messages.
Permanent address
A permanent address is assigned by the State registry. This is a two-step process:
Address blocks are allocated by ICAO to State registries, per table 9.1 in Annex 10.
The State registry then assigns addresses to aircraft by picking in its allocated block.
Special blocks are allocated to ICAO and not available to State registries.
- 1000-10-011-001-00 (1000-address block)
- 1111-00-001-001-00 (1000-address block)
- 1111-00-000 (32,000-address block)
Temporary address
ICAO block 1111-00-001-001-00 is used for temporary addresses, when users are waiting for the registering procedure to complete. Assignment is administered by ICAO, not by a State registry.
Anonymous address (for UAT only)
For privacy purposes, a pseudo-random self-assigned address can be built by the aircraft equipment, starting from the permanent address if there is one, else from the current time, see this question for details.
TIS-B self-assigned address
When an aircraft is tracked by a ground station, but is not equipped with ADS-B (Out), other aircraft equipped with ABS-B (In) cannot see it. In this case the ground station can send messages using TIS-B, containing position information related to the non-equipped aircraft (known as the target).
Only a 12-bit squawk code is visible to the ground equipment. A TIS-B ground equipment then creates a fake 24-bit address to identify the target of the message, composed of the 12-bit code and 12 additional bits randomly assigned to the aircraft track. See this question for details (with a bit of luck, @DeltaLima will post an answer here, he's a specialist in this field)
Duplicates
The probability to see the same address in a given area is very low, but not null, because:
The same permanent address can be re-used by surface equipments distant by more than 1,000km.
Errors can be made while configuring the permanent address in the equipment (some questions on the site relate to flight trackers identifying the wrong aircraft due to address configuration mistakes).
Self-assigned UAT addresses conflicting either with a permanent address or another self-assigned address. The probability is lower than the one of a permanent address duplicate.
Perhaps the same for self-assigned TIS-B target addresses.
GDL 90 24-bit address
As you mentioned working a on GDL 90 stream, all types of addresses mentioned above can be seen in the address field 'aa aa aa' of the GDL messages. The uniqueness of this field, even combined with field 't' cannot be guaranteed.
I have read (but can't remember where at the moment) the usual way to deal with Mode S address duplicates is to keep track of the 3 latest.