Notes on User tracing and fingerprinting. Firestorm and other viewers send identification information to grids whether you login to home, or teleport to another remote grid.
This includes your IP address, your Mac address (unique identifier assigned to a network interface), and "Id0" which is a hash of the serial number on your harddrive (plus other system information). It's a hash so it doesn't send your actual serial number.
How can these identifiers be used? They can be used to enhance blocking capabilities, such as disruptive users with bad intentions. IP based blocks/geofencing is not reliable. The Mac address provides an additional level of blocking, since the Mac does not normally change even if the IP address changes. The Disk serial adds another layer. The serial number would normally be the same no matter what viewer is used. Presently Firestorm/other viewers do not use CPU serial, motherboard serial, or TPM, or other hardware identifying information to calculate the hash.
Ways users can protect privacy and circumvent tracking.
There are software applications that can randomize your Mac and also disk serial number.
Note that changing your disk serial number can possibly cause issues with the operating system function and other applications.
Changing the Mac address on a Linux computer network interface is trivial.
Using a VM/Virtual Machine - typically VM's randomize the Mac and also there is usually a way to set it. But you'd want a good VM with GPU passthrough to get good FPS on OpenSim, like a KVM with VFIO. Using a VM can also make it easier to randomize the disk serial.
However, probably the best bet is to compile Firestorm from source (github) and modify the indra/newview/llapviewer* for your platform (like win32) and change the function generateSerialNumber(). you'll also find it easy to change the Mac address sent by modifying the Firestorm code.
For the IP you can use a VPN or something or perhaps your grid offers a direct wireguard vpn connection like my grid Holoneon. You could also use Tor onion router but the latency isn't ideal.
If you run your own grid for other users you should note that collecting Mac/disk serial number hash is possibly covered under GDPR regulations (and other rules) and possibly should be specified in your published privacy policy. Check it out!
Opensimulator automatically captures the viewer id information sent and uses it to authenticate user activity. This happens in Gatekeeper.
You can add a little module to store that in a database if you want to identify problem users.
schema
CREATE TABLE `user_login_fingerprints` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`agent_uuid` char(36) NOT NULL,
`first_name` varchar(64) DEFAULT NULL,
`last_name` varchar(64) DEFAULT NULL,
`ip_address` varchar(45) DEFAULT NULL,
`mac` varchar(64) DEFAULT NULL,
`id0` varchar(64) DEFAULT NULL,
`home_uri` varchar(255) DEFAULT NULL,
`login_time` datetime DEFAULT current_timestamp(),
PRIMARY KEY (`id`),
KEY `idx_agent` (`agent_uuid`),
KEY `idx_mac` (`mac`),
KEY `idx_id0` (`id0`),
KEY `idx_ip` (`ip_address`)
) ENGINE=InnoDB AUTO_INCREMENT=266 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
OpenSim/Services/HypergridService/LoginFingerprintRecorder.cs
using System;
using MySql.Data.MySqlClient;
namespace OpenSim.Services.HypergridService
{
public static class LoginFingerprintRecorder
{
private static string _connStr = string.Empty;
public static void Init(string connStr)
{
_connStr = connStr ?? string.Empty;
}
public static void Record(
string agentId,
string firstName,
string lastName,
string ip,
string mac,
string id0,
string homeUri)
{
if (string.IsNullOrEmpty(_connStr))
return;
try
{
using var conn = new MySqlConnection(_connStr);
conn.Open();
using var cmd = conn.CreateCommand();
cmd.CommandText = @"
INSERT INTO user_login_fingerprints
(agent_uuid, first_name, last_name, ip_address, mac, id0, home_uri)
VALUES
(@agent, @fn, @ln, @ip, @mac, @id0, @home)";
cmd.Parameters.AddWithValue("@agent", agentId);
cmd.Parameters.AddWithValue("@fn", firstName);
cmd.Parameters.AddWithValue("@ln", lastName);
cmd.Parameters.AddWithValue("@ip", ip);
cmd.Parameters.AddWithValue("@mac", mac);
cmd.Parameters.AddWithValue("@id0", id0);
cmd.Parameters.AddWithValue("@home", homeUri);
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
Console.WriteLine("[FingerprintRecorder] " + e.Message);
}
}
}
}
then add the logger to gatekeeper in function public bool LoginAgent()
OpenSim/Services/HypergridService/GatekeeperService.cs
_ = System.Threading.Tasks.Task.Run(() =>
{
LoginFingerprintRecorder.Record(
aCircuit.AgentID.ToString(),
aCircuit.firstname,
aCircuit.lastname,
aCircuit.IPAddress,
aCircuit.Mac,
aCircuit.Id0,
(source == null) ? "Unknown" : string.Format("{0} ({1}){2}", source.RegionName, source.RegionID, (source.RawServerURI == null) ? "" : " @ " + source.ServerURI)
);
});