From 7f7ec6e42e5b8d2054b2b207b08147851f98f930 Mon Sep 17 00:00:00 2001 From: ep0chzer0 Date: Mon, 23 Feb 2026 13:27:54 -0500 Subject: [PATCH] feat: add detector for complex struct getters with omitted members Add a new informational detector that identifies public state variables containing structs where the automatic getter omits array and mapping members. Solidity's generated getters skip these types, which may cause confusion about data accessibility. The detector: - Finds public state variables with struct types - Identifies array and mapping members that are omitted from the getter - Recursively checks nested structs for deeply omitted members - Handles recursive struct types safely - Lists all omitted members with their types Closes #2779 --- slither/detectors/all_detectors.py | 1 + .../variables/complex_struct_getter.py | 127 ++++++++++++++++++ ...ter_0_8_0_complex_struct_getter_sol__0.txt | 6 + .../0.8.0/complex_struct_getter.sol | 72 ++++++++++ .../0.8.0/complex_struct_getter.sol-0.8.0.zip | Bin 0 -> 9081 bytes tests/e2e/detectors/test_detectors.py | 5 + 6 files changed, 211 insertions(+) create mode 100644 slither/detectors/variables/complex_struct_getter.py create mode 100644 tests/e2e/detectors/snapshots/detectors__detector_ComplexStructGetter_0_8_0_complex_struct_getter_sol__0.txt create mode 100644 tests/e2e/detectors/test_data/complex-struct-getter/0.8.0/complex_struct_getter.sol create mode 100644 tests/e2e/detectors/test_data/complex-struct-getter/0.8.0/complex_struct_getter.sol-0.8.0.zip diff --git a/slither/detectors/all_detectors.py b/slither/detectors/all_detectors.py index 6301979b50..893f9f5e7e 100644 --- a/slither/detectors/all_detectors.py +++ b/slither/detectors/all_detectors.py @@ -21,6 +21,7 @@ from .variables.unused_state_variables import UnusedStateVars from .variables.could_be_constant import CouldBeConstant from .variables.could_be_immutable import CouldBeImmutable +from .variables.complex_struct_getter import ComplexStructGetter from .statements.tx_origin import TxOrigin from .statements.assembly import Assembly from .operations.low_level_calls import LowLevelCalls diff --git a/slither/detectors/variables/complex_struct_getter.py b/slither/detectors/variables/complex_struct_getter.py new file mode 100644 index 0000000000..ad05a64244 --- /dev/null +++ b/slither/detectors/variables/complex_struct_getter.py @@ -0,0 +1,127 @@ +""" +Module detecting public state variables with complex struct types +where the automatic getter omits array and mapping members. +""" + +from slither.core.declarations import Structure +from slither.core.solidity_types import ArrayType, MappingType, UserDefinedType +from slither.core.solidity_types.type import Type +from slither.core.variables.structure_variable import StructureVariable +from slither.detectors.abstract_detector import ( + AbstractDetector, + DetectorClassification, + DETECTOR_INFO, +) +from slither.utils.output import Output + + +def _find_omitted_members( + struct: Structure, seen: set[str] | None = None +) -> list[StructureVariable]: + """Find struct members that are omitted from the automatic getter. + + Solidity's automatic getters skip array and mapping members in structs. + This function also recurses into nested structs to find deeply omitted members. + """ + if seen is None: + seen = set() + + # Prevent infinite recursion from recursive struct types + if struct.canonical_name in seen: + return [] + seen.add(struct.canonical_name) + + omitted: list[StructureVariable] = [] + for member in struct.elems_ordered: + member_type = member.type + if isinstance(member_type, (ArrayType, MappingType)): + omitted.append(member) + elif isinstance(member_type, UserDefinedType) and isinstance(member_type.type, Structure): + # Recursively check nested structs + nested_omitted = _find_omitted_members(member_type.type, seen) + if nested_omitted: + omitted.extend(nested_omitted) + + return omitted + + +class ComplexStructGetter(AbstractDetector): + """ + Detect public state variables with struct types where the automatic getter + omits array or mapping members. + """ + + ARGUMENT = "complex-struct-getter" + HELP = "Public struct getters with omitted members" + IMPACT = DetectorClassification.INFORMATIONAL + CONFIDENCE = DetectorClassification.HIGH + + WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#complex-struct-getter" + + WIKI_TITLE = "Complex struct getter" + WIKI_DESCRIPTION = ( + "Detect public state variables containing structs where the automatic getter " + "omits array and mapping members. Solidity's generated getters skip these types, " + "which may cause confusion about data accessibility." + ) + + # region wiki_exploit_scenario + WIKI_EXPLOIT_SCENARIO = """ +```solidity +struct UserData { + string name; + uint256 balance; + uint256[] tokenIds; + mapping(address => uint256) allowances; +} + +contract Example { + UserData public userData; +} +``` +The automatic getter for `userData` will not return `tokenIds` or `allowances`, \ +potentially causing integration issues with external contracts or front-ends.""" + # endregion wiki_exploit_scenario + + WIKI_RECOMMENDATION = ( + "Create a custom getter function that returns the omitted members, " + "or separate complex members into their own state variables." + ) + + def _detect(self) -> list[Output]: + results = [] + + for contract in self.compilation_unit.contracts_derived: + if contract.is_interface or contract.is_from_dependency(): + continue + + for var in contract.state_variables_declared: + if var.visibility != "public": + continue + + if not isinstance(var.type, UserDefinedType): + continue + + if not isinstance(var.type.type, Structure): + continue + + struct = var.type.type + omitted = _find_omitted_members(struct) + + if not omitted: + continue + + omitted_names = ", ".join(f"{m.name} ({m.type})" for m in omitted) + + info: DETECTOR_INFO = [ + var, + " is a public state variable of type ", + struct, + " whose automatic getter omits: ", + omitted_names, + "\n", + ] + res = self.generate_result(info) + results.append(res) + + return results diff --git a/tests/e2e/detectors/snapshots/detectors__detector_ComplexStructGetter_0_8_0_complex_struct_getter_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_ComplexStructGetter_0_8_0_complex_struct_getter_sol__0.txt new file mode 100644 index 0000000000..a633a9cffb --- /dev/null +++ b/tests/e2e/detectors/snapshots/detectors__detector_ComplexStructGetter_0_8_0_complex_struct_getter_sol__0.txt @@ -0,0 +1,6 @@ +DirectArrayMapping.config (complex_struct_getter.sol#12) is a public state variable of type DirectArrayMapping.Config (complex_struct_getter.sol#7-11) whose automatic getter omits: limits (uint256[]), whitelist (mapping(address => bool)) + +NestedStruct.settings (complex_struct_getter.sol#23) is a public state variable of type NestedStruct.Outer (complex_struct_getter.sol#19-22) whose automatic getter omits: values (uint256[]) + +MappingOnly.permissions (complex_struct_getter.sol#31) is a public state variable of type MappingOnly.Permissions (complex_struct_getter.sol#27-30) whose automatic getter omits: allowed (mapping(address => bool)) + diff --git a/tests/e2e/detectors/test_data/complex-struct-getter/0.8.0/complex_struct_getter.sol b/tests/e2e/detectors/test_data/complex-struct-getter/0.8.0/complex_struct_getter.sol new file mode 100644 index 0000000000..c72d095d14 --- /dev/null +++ b/tests/e2e/detectors/test_data/complex-struct-getter/0.8.0/complex_struct_getter.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +// --- Should be flagged --- + +contract DirectArrayMapping { + struct Config { + address owner; + uint256[] limits; + mapping(address => bool) whitelist; + } + Config public config; +} + +contract NestedStruct { + struct Inner { + uint256[] values; + } + struct Outer { + Inner data; + string name; + } + Outer public settings; +} + +contract MappingOnly { + struct Permissions { + uint256 level; + mapping(address => bool) allowed; + } + Permissions public permissions; +} + +// --- Should NOT be flagged --- + +contract SimpleStruct { + struct Info { + address owner; + uint256 balance; + string name; + } + Info public info; +} + +contract PrivateComplex { + struct Data { + uint256[] items; + mapping(address => uint256) balances; + } + Data internal data; + + function getData() external view returns (uint256[] memory) { + return data.items; + } +} + +contract NoStruct { + uint256 public value; + address public owner; +} + +contract NestedSimple { + struct InnerSimple { + uint256 x; + uint256 y; + } + struct OuterSimple { + InnerSimple point; + string label; + } + OuterSimple public shape; +} diff --git a/tests/e2e/detectors/test_data/complex-struct-getter/0.8.0/complex_struct_getter.sol-0.8.0.zip b/tests/e2e/detectors/test_data/complex-struct-getter/0.8.0/complex_struct_getter.sol-0.8.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..b28e993042092e59088272d0d7ae700ce4434f3f GIT binary patch literal 9081 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

|Add}r8enJgLT ztRp*_IT%t_qck;vJebQQ+ewnG4)}8ULv9nA2!_@`)?;hFxWPkayq; z!;0J)K|pLZ!d?YBE^4(2w}L=GuQ|41ji%dDFkx>*h(H(b%D$gs)2DUYqJfLX6Q(UE zI2o>o)+c=rmu;*`@-1^N(qZsQX$_r3{S%t87jNN#T+oL8*()pA1*-0s&eMog`YEN(9Z2OQy5d>Z-uN=(Hv7nu`ITdS6tPna?^sEqkjZfyQ@x?h1 zr3t`fCLk*r4b1_Ac?o9}Cc{FO2MloMfhd0);u=?(bA)si^Aq-&{!$owLRHV2%94|a6NeHc8x_eGOcoYYbA?95brEMslR^pX z073dfcAvjxZ^9@)NV)s6Eh9ua!g?aa1#R}#C!Aw@EgzSs;Kxw0q>J0)lV-cP+bBjE zj4+go>cy(5Ao>v?qI*rrd<;3@-O(^ZiOrn77KZPxd{!zu^JyMa=9;I#ACDtx&EE+I zVZwXu?%-5MClW-HL%&ho#Fnwch|dG=CQ*)UynlujFMlgD&M6ZNOXG!)h3ZvM5*1&A z%?`dBs+XCGa{e?s9u~54MJ9$Gv`cx%5vE&@C`hqZTo-LF6-6rLuOiZk&e zc+B(Y1WtW8&_;JVOdZdaYf=}es{HiH=L-u&1A43rMKk8E_*+McA| z)K4Wl*vQHU{t$m~*Q<9-rIeg|Aw~HNahGNgQYRILiD>9l^rPRc<8emq)w84OY>~2c z`WDmNDiDb%+_&}jM`4=ev1}#ToC2c!_g#8C4O{~q9i3xF1==EjRumiuom40%@HaN;3l@4aFzoz&Z=f!$$UPm}lZE)%n3|GCz5xhA&M&{pf` zQxmk?LOu>DA9}Rf5UEtd@BV-RH0WdON_RI0?D5qpZ(~wz*{k|x>%1Yeq|O3$JHWF* zWMv$@Cg7Fo9SBEu(dVofK+8@Y%*Kyy&m+Ztze`gLq{|o5tCV@K#~tiv+5^W8rdfnB zQ_Rkbe!UexEJ&Mwb`Y*UGJp4C$dcz1V6aHprB-iz`ND3`JCf$+byWYa3bS|jk`yOG zgga$|gwYvt7}5D-RIw7*-kRk&|F|)$UWIZ+fEo@_6#d#gB5ik?T$z6Bh0horEbv+` zMNZg8oarg8vS~KaZ{gL&+I9d-EA4-;;VI7D%9~d@9M0uN2areKkBna!^n!?k?}tY2 z0y~kT6Dzv=0h)qclZ7NDifc+l1*Z1ITNYSFw#wgj1Y5F9$sfEkO4hwHKs57)ma0G3 zCzx!HlIncw(sa}hBGL$550j6u2iU+?@qwB|Mz02v3|s@_hDHY!hD*NBTE0j;i#&Al zHF9k=OU)nT(uFYsh3i`oK`J@@bN3J3NLv9NiQQF>Tv3KOYB;rh5<4sB z^x<^_A4V*|gI(7qUuRLBW@jciT7PXXq}8zLa2;OBgI2XjQR#~WyTym{Lk{0FlMEXZI!#_IFzt*d1o}5Pg6{4mDJOz zi$Yu3sFlui5NY)A?r*(cpu=xbNFQn(A??eSfRV&VRP87W$6#x^ZF zrjc=&MS0L4z>-$fZqBwh51g|ll7`8Pm%Fb0teR%_j8$UJVQWI5AP!Tx~51p9jBa=iZeD%Ocer84uk>Sop9OO=yMw^U<;m!^p-5KQZ z-p>4omX@#o5D8Tb3xEyAH%=>{rC!56eOq6&G+y47?=nsj7wPW926q|jW{*97qBNwq zQq&oec`jwjwuEA{o)k^a{C&ORJvz!Mo zw{lzTh`?3@gT93#Atw5w$x25x)h~y%C~3KS zuLmp{F6=ju0MvVi!0^aw275oeR()3#Mx_5iYs+w5W3_efNnZ7oSY>)NhPZjJKM01} zk7>}2P{XwnYau8kT1x1kSbnZ+xj6UVgN`f;rbByz+-Wh3cPYnIU;DSgw6xELY}thU zAqMcrj?7yrVQ(|tmC-dlQyK=dt8TXh)~RI2tP%ETAu49aII+9-%k{WtFUKh;12JtW zhpSQI9@a}Yev1e@=YASmjA2DwJl2D0NRS8NY*;X$`1U)GcAs*x)M#3md)Ja1XPa&*E3;VNR zGU+GCTJIB1lI!-;_=;Ns2s3L?!+^&Nq~#9Ad&c_pw_&oLd>Jdt?5%T)cRX+#(*S?} z&(p)c<#I1ms_?E^+3s=UQvLVauRXrr?0K~;OAD1Pa%mHKnJE*G3qXy)PPHyvr)Tz} zD$rD8HS_i7VcT4VwMS9vzV|aomS^7IKUpl1s0URiimwji{U9wPzt{ISADuTZ4SkjC zW3P^$?k75KzPEsn_w17%@7n`NRvsRA(>18PBYiT8Jg|CLMl#^GVl;ZAPQvi*;r%W6 z3G4dd%Uq0Fqg-n@%O1L`rps_^$wDjS9)s8 zWl(cEKt5Y^!Qqd4OXZ)OB zRrmMh+@LtQ6XV;9f1oYsP~Cp(%i<|bL0rPAm$`07=ksp@_zsq`QjFTd)jgs*e<_zEv9bT*3$YCu#3F)d%lC$JHGcK<9uzf%ISAOm;VRH6m#Mg zx79;6s8q9?>Uu1fqfv`o=uKEf9vTJ*_J3!>{3FBsKPe9S&;6fxF)H%#2>&%f|5Lqx K9*O$D?0*1jNzMZR literal 0 HcmV?d00001 diff --git a/tests/e2e/detectors/test_detectors.py b/tests/e2e/detectors/test_detectors.py index 7bd6e34600..9c73b45509 100644 --- a/tests/e2e/detectors/test_detectors.py +++ b/tests/e2e/detectors/test_detectors.py @@ -539,6 +539,11 @@ def id_test(test_item: Test): "immut_state_variables.sol", "0.8.0", ), + Test( + all_detectors.ComplexStructGetter, + "complex_struct_getter.sol", + "0.8.0", + ), Test( all_detectors.ExternalFunction, "external_function.sol",