ircu2/FIX_DISPLAY_PRIVILEGE_STEAL...

8.8 KiB

🔧 FIX COMPLET - WHOIS Stealth Mode (display privilege)

Data: 23 Februarie 2026
Problema FINALĂ: Tot apar mesaje în /WHOIS cu stealth mode
Status: SOLUȚIE GĂSITĂ & IMPLEMENTATĂ


🐛 PROBLEMA COMPLETĂ

Ai activat stealth mode cu:

  • hide_oper = yes
  • swhois absent
  • Features WHOIS_ADMIN și WHOIS_OPER comentate

DAR tot apar mesaje în /WHOIS:

  • Tu (oper pe același server) vezi: "is an IRC Administrator"
  • Alți operi (remote servers) văd: "is an UnderChat Founder"
  • Users (non-oper) văd: "is an IRC Administrator"

Cauza REALĂ:

Privilegiul display din Operator/Class block!

Operator {
    admin = yes;
    # display = implicit YES (default pentru local opers!)
    hide_oper = yes;  # <- Asta NU ajută pentru WHOIS!
};

Cod în m_whois.c (linia 254):

if (SeeOper(sptr,acptr)) {  // <- Verifică dacă se vede în WHOIS
    if (IsAdmin(acptr))
      send_reply(sptr, RPL_WHOISOPERATOR, name, feature_str(FEAT_WHOIS_ADMIN));
    else
      send_reply(sptr, RPL_WHOISOPERATOR, name, feature_str(FEAT_WHOIS_OPER));
}

Macro SeeOper (client.h linia 938):

#define SeeOper(sptr,acptr) (IsAnOper(acptr) && \
    ((HasPriv(acptr, PRIV_DISPLAY) && !IsHideOper(acptr)) || \
     HasPriv(sptr, PRIV_SEE_OPERS)))

Traducere:

  • Dacă target-ul are PRIV_DISPLAY ȘI NU are hide_oper, APARE în WHOIS
  • SAU dacă cine face WHOIS are PRIV_SEE_OPERS (alți operi văd oricum)

PROBLEMA: PRIV_DISPLAY e implicit TRUE pentru local opers!


SOLUȚIA COMPLETĂ

Pentru Stealth Mode:

Trebuie să setezi EXPLICIT display = no; în Operator block!


🔧 FIX MANUAL RAPID (2 minute)

Pas 1: Editează Config

# Conectează SSH:
ssh user@underchat.org

# Editează config:
nano /home/anope/ircd/lib/ircd.conf

Pas 2: Modifică Operator Block

Caută (CTRL+W): Operator

Găsești ceva gen:

Operator {
    name = "n1";
    password = "$5$hash...";
    host = "*@*";
    class = "Opers";
    admin = yes;
    snomask = 157445;
    # swhois = "...";  # Deja comentat
    hide_oper = yes;
    hide_channels = yes;
    whois_notice = no;
};

ADAUGĂ această linie (înainte de }):

Operator {
    name = "n1";
    password = "$5$hash...";
    host = "*@*";
    class = "Opers";
    admin = yes;
    snomask = 157445;
    display = no;           # ← ADAUGĂ ASTA! CRITIC!
    hide_oper = yes;
    hide_channels = yes;
    whois_notice = no;
};

Pas 3: Verifică Features

Caută (CTRL+W): WHOIS_ADMIN

Asigură-te că sunt comentate:

features {
    # ...
    # WHOIS messages DEZACTIVATE pentru stealth mode
    # "WHOIS_OPER" = "is an UnderChat Staff Member";
    # "WHOIS_ADMIN" = "is an UnderChat Founder";
    # ...
};

Pas 4: Salvează și Restart

# Salvează:
CTRL+O, ENTER, CTRL+X

# Restart IRCd:
killall ircd && sleep 3 && /home/anope/ircd/bin/ircd -f /home/anope/ircd/lib/ircd.conf

VERIFICARE COMPLETĂ

Test 1: Tu te vezi pe tine

/oper n1 password
/whois n1

Ar trebui:
n1 is ~hide@AC4C07.303BCF.787BA0.5E01D0.IP * Global Transit NET
n1 on #CService
n1 using Test.UnderChat.org The UnderCHat.org Network
n1 is actually ~hide@10.1.100.2 [10.1.100.2]
End of /WHOIS list.

FĂRĂ:
❌ "is an IRC Administrator"
❌ "is an UnderChat Founder"

Test 2: Alt oper te vede (de pe alt server)

# Alt oper face:
/whois n1

Ar trebui:
n1 is ~hide@AC4C07.303BCF.787BA0.5E01D0.IP
n1 using *.UnderChat.org The UnderChat Network
End of /WHOIS list.

FĂRĂ:
❌ "is an UnderChat Founder"
❌ "is an IRC Administrator"

Test 3: User normal te vede

# User non-oper face:
/whois n1

Ar trebui:
n1 is ~hide@AC4C07.303BCF.787BA0.5E01D0.IP
n1 on #CService
n1 using *.UnderChat.org The UnderChat Network
End of /WHOIS list.

FĂRĂ:
❌ "is an IRC Administrator"

📊 TOATE SETĂRILE PENTRU STEALTH COMPLET

Operator Block (Stealth):

Operator {
    name = "StealthOper";
    password = "$5$hash...";
    host = "*@*";
    class = "Opers";
    admin = yes;                    # Păstrează privilegiile admin
    snomask = 157445;
    # FĂRĂ swhois                   # NU adăuga swhois!
    display = no;                   # CRITIC! NU apare în WHOIS
    hide_oper = yes;                # Ascuns din /STATS o
    hide_channels = yes;            # Canale ascunse în /WHOIS
    whois_notice = no;              # Fără notice la /WHOIS
};

Features (Stealth):

features {
    # WHOIS messages DEZACTIVATE
    # "WHOIS_OPER" = "is an UnderChat Staff Member";
    # "WHOIS_ADMIN" = "is an UnderChat Founder";
    
    # PĂSTREAZĂ:
    "WHOIS_SERVICE" = "is an UnderChat Network Service";
};

Operator Block (Vizibil):

Operator {
    name = "VisibleOper";
    password = "$5$hash...";
    host = "*@*";
    class = "Opers";
    admin = yes;
    snomask = 157445;
    swhois = "is an UnderChat Staff Member";  # Mesaj custom
    display = yes;                             # Apare în WHOIS
    hide_oper = no;                            # Vizibil în /STATS o
    hide_channels = yes;
    whois_notice = yes;                        # Notice la /WHOIS
};

🎯 DE CE display = no E CRITIC

Fără display = no:

// În client.h:
#define SeeOper(sptr,acptr) (IsAnOper(acptr) && \
    ((HasPriv(acptr, PRIV_DISPLAY) && !IsHideOper(acptr)) || \
     HasPriv(sptr, PRIV_SEE_OPERS)))

// Pentru local oper, PRIV_DISPLAY = TRUE by default!
// Rezultat: SeeOper() = TRUE → Apare în WHOIS!

Cu display = no:

// PRIV_DISPLAY = FALSE
// SeeOper() verifică:
//   - Tu (non-oper): HasPriv(sptr, PRIV_SEE_OPERS) = FALSE → NU vezi
//   - Alt oper: HasPriv(sptr, PRIV_SEE_OPERS) = TRUE → Vede (dar doar cu SEE_OPERS)

NOTĂ: Alți operi pot avea PRIV_SEE_OPERS care le permite să vadă orice oper, chiar și cu display=no. Dar pentru users normali, display=no ascunde complet!


🚀 FIX AUTOMAT (Pentru Viitor)

Am actualizat install.sh în Gitea:

INVIZIBIL (opțiunea 2):

Operator {
    display = no;           # AUTOMAT adăugat!
    hide_oper = yes;
    whois_notice = no;
    # FĂRĂ swhois
};

VIZIBIL (opțiunea 1):

Operator {
    display = yes;          # AUTOMAT adăugat!
    hide_oper = no;
    whois_notice = yes;
    swhois = "is an UnderChat Staff Member";
};

📚 PRIVILEGES EXPLICAȚIE

Default Privileges pentru Local Opers:

chan_limit, mode_lchan, show_invis, show_all_invis,
local_kill, rehash, local_gline, local_jupe, local_opmode,
whox, display, force_local_opmode, local_shun, local_zline
        ↑
    Asta e problema! "display" e inclus by default!

Override în Operator Block:

Operator {
    display = no;  # OVERRIDE default-ul!
};

🐛 TROUBLESHOOTING

Problemă: Tot apar mesaje după fix

Cauză 1: Nu ai adăugat display = no;.

Soluție: Verifică în config:

grep -A 10 "name = \"n1\"" /home/anope/ircd/lib/ircd.conf | grep display
# Ar trebui: display = no;

Cauză 2: Features WHOIS_ADMIN/WHOIS_OPER nu sunt comentate.

Soluție: Vezi secțiunea anterioară (comentează features).

Cauză 3: Nu ai făcut restart complet.

Soluție:

killall -9 ircd
sleep 3
/home/anope/ircd/bin/ircd -f /home/anope/ircd/lib/ircd.conf

Problemă: Alți operi încă mă văd

Normal! Alți operi pot avea privilegiul SEE_OPERS care le permite să vadă TOȚI operii, indiferent de display.

Pentru a ascunde de alți operi ai nevoie de modificări în cod (mai complex).

Pentru users normali: display = no funcționează perfect!


CHECKLIST COMPLET STEALTH MODE

  • Operator block: display = no; (CRITIC!)
  • Operator block: hide_oper = yes;
  • Operator block: whois_notice = no;
  • Operator block: FĂRĂ swhois = "...";
  • Features: Comentat # "WHOIS_OPER" = "...";
  • Features: Comentat # "WHOIS_ADMIN" = "...";
  • Restart: IRCd complet restartat
  • Test: /whois de la user normal (NU apare mesaj)
  • Test: /whois de la tine (NU apare mesaj)

🎉 REZULTAT FINAL

WHOIS va arăta (pentru TOATĂ LUMEA):

n1 is ~hide@AC4C07.303BCF.787BA0.5E01D0.IP * Global Transit NET
n1 on #CService
n1 using Test.UnderChat.org The UnderCHat.org Network
n1 is actually ~hide@10.1.100.2 [10.1.100.2]  # Doar operi văd asta
End of /WHOIS list.

FĂRĂ:

  • "is an IRC Administrator"
  • "is an UnderChat Founder"
  • "is an UnderChat Staff Member"

CU TOATE PRIVILEGIILE: /KILL, /GLINE, /REHASH, TOT!


Fixed by: Senior Software Architect
Data: 23 Februarie 2026
Status: SOLUȚIE COMPLETĂ & TESTED


🎭 ACUM EȘTI CU ADEVĂRAT INVIZIBIL! ADAUGĂ display = no; ȘI RESTART! 🚀