Skip to content

Commit e084086

Browse files
committed
Improve pointer verification in super_block->get_type()
1 parent 7b2e259 commit e084086

File tree

1 file changed

+52
-10
lines changed
  • volatility3/framework/symbols/linux/extensions

1 file changed

+52
-10
lines changed

volatility3/framework/symbols/linux/extensions/__init__.py

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -638,11 +638,23 @@ def get_flags_opts(self) -> Iterable[str]:
638638
]
639639
return sb_opts
640640

641-
def get_type(self):
642-
mnt_sb_type = utility.pointer_to_string(self.s_type.name, count=255)
643-
if self.s_subtype:
644-
mnt_sb_subtype = utility.pointer_to_string(self.s_subtype, count=255)
641+
def get_type(self) -> Optional[str]:
642+
"""Gets the superblock filesystem type string"""
643+
644+
s_type_ptr = self.s_type
645+
if not (s_type_ptr and s_type_ptr.is_readable()):
646+
return None
647+
648+
s_type_name_ptr = s_type_ptr.name
649+
if not (s_type_name_ptr and s_type_name_ptr.is_readable()):
650+
return None
651+
652+
mnt_sb_type = utility.pointer_to_string(s_type_name_ptr, count=255)
653+
s_subtype_ptr = self.s_subtype
654+
if s_subtype_ptr and s_subtype_ptr.is_readable():
655+
mnt_sb_subtype = utility.pointer_to_string(s_subtype_ptr, count=255)
645656
mnt_sb_type += "." + mnt_sb_subtype
657+
646658
return mnt_sb_type
647659

648660

@@ -843,25 +855,55 @@ def get_subdirs(self) -> interfaces.objects.ObjectInterface:
843855
dentry_type_name = self.get_symbol_table_name() + constants.BANG + "dentry"
844856
yield from list_head_member.to_list(dentry_type_name, walk_member)
845857

858+
def get_inode(self) -> interfaces.objects.ObjectInterface:
859+
"""Returns the inode associated with this dentry"""
860+
861+
inode_ptr = self.d_inode
862+
if not (inode_ptr and inode_ptr.is_readable() and inode_ptr.is_valid()):
863+
return None
864+
865+
return inode_ptr.dereference()
866+
846867

847868
class struct_file(objects.StructType):
848869
def get_dentry(self) -> interfaces.objects.ObjectInterface:
849-
if self.has_member("f_dentry"):
850-
return self.f_dentry
851-
elif self.has_member("f_path"):
870+
"""Returns a pointer to the dentry associated with this file"""
871+
if self.has_member("f_path"):
852872
return self.f_path.dentry
873+
elif self.has_member("f_dentry"):
874+
return self.f_dentry
853875
else:
854876
raise AttributeError("Unable to find file -> dentry")
855877

856878
def get_vfsmnt(self) -> interfaces.objects.ObjectInterface:
857879
"""Returns the fs (vfsmount) where this file is mounted"""
858-
if self.has_member("f_vfsmnt"):
859-
return self.f_vfsmnt
860-
elif self.has_member("f_path"):
880+
if self.has_member("f_path"):
861881
return self.f_path.mnt
882+
elif self.has_member("f_vfsmnt"):
883+
return self.f_vfsmnt
862884
else:
863885
raise AttributeError("Unable to find file -> vfs mount")
864886

887+
def get_inode(self) -> interfaces.objects.ObjectInterface:
888+
"""Returns an inode associated with this file"""
889+
890+
inode_ptr = None
891+
if self.has_member("f_inode") and self.f_inode and self.f_inode.is_readable():
892+
# Try first the cached value, kernels +3.9
893+
inode_ptr = self.f_inode
894+
895+
if not (inode_ptr and inode_ptr.is_readable() and inode_ptr.is_valid()):
896+
dentry_ptr = self.get_dentry()
897+
if not (dentry_ptr and dentry_ptr.is_readable()):
898+
return None
899+
900+
inode_ptr = dentry_ptr.d_inode
901+
902+
if not (inode_ptr and inode_ptr.is_readable() and inode_ptr.is_valid()):
903+
return None
904+
905+
return inode_ptr.dereference()
906+
865907

866908
class list_head(objects.StructType, collections.abc.Iterable):
867909
def to_list(

0 commit comments

Comments
 (0)