Skip to content

requests.utils function accepts invalid ip/cidr input #5131

Description

@disconnect3d

TLDR: On some libc implementations (e.g. glibc) the socket.inet_aton function parses IP strings trailed with whitespace and garbage, and this function is used by requests utility functions which if used externally, may cause bugs or/and security vulnerabilities.

An example of the issue can be seen below:
image

I have written a more detailed description of the socket.inet_aton's underlying problem on Python's bugtracker issue 37495. It is yet to be decided if this is going to be fixed in Python.

Expected Result

The requests.utils functions address_in_network, is_ipv4_address and is_valid_cidr should fail with invalid input.

Actual Result

Incorrect IP strings do not return an error and instead return as if the trailing garbage did not exist in the IP string.

Reproduction Steps

import requests

print(requests.utils.address_in_network('1.1.1.1 wtf', '1.1.1.1/24'))
print(requests.utils.is_ipv4_address('1.1.1.1 disconnect3d was here...'))
print(requests.utils.is_valid_cidr('1.1.1.1 obviously not but yes/24'))

System Information

The issue is related to libc implementation and has been tested on glibc 2.27 and 2.29.

It also occurs on MacOS which I am not sure if it is based on glibc.

Activity

  1. HJones82493 commented on Jul 10, 2019

    @HJones82493

    PR #5135
    I feel as though the call to the socket library is actually unnecessary here.

  2. disconnect3d commented on Nov 29, 2023

    @disconnect3d
    Author

    Ping @kennethreitz @Lukasa @sigmavirus24 @nateprewitt @slingamn can we finally get some love here and get this fixed?

    This could probably also be marked as a security issue since if someone uses this in a security relevant context, they can get in trouble. (Although I doubt and hope that nobody does use those functions in such a way).

  3. sigmavirus24 commented on Nov 29, 2023

    @sigmavirus24
    Contributor

    These are not intended for use by others. The fact the language has no way of making things as private or internal means that we can't stop people from giving a function not intended for public use garbage or getting garbage out

  4. sigmavirus24 commented on Nov 29, 2023

    @sigmavirus24
    Contributor

    Also, @disconnect3d rather than demand free labor of others, you're welcome to submit a fix for this

  5. disconnect3d commented on Nov 29, 2023

    @disconnect3d
    Author

    These are not intended for use by others. The fact the language has no way of making things as private or internal means that we can't stop people from giving a function not intended for public use garbage or getting garbage out

    The typical way to mark this is to prefix the name with underscore or two ;).

  6. sigmavirus24 commented on Nov 30, 2023

    @sigmavirus24
    Contributor

    Yeah and people still use it from this library so we stopped bothering. I've been maintaining this library for almost a decade now. Writing python for longer. I know what the convention is and I know people don't care

  7. HJones82493 commented on Nov 30, 2023

    @HJones82493

    Is there an argument against using socket.inet_pton instead of socket.inet_aton? It seems like socket.inet_pton has had its implementation fixed to not accept the extra strings and could solve this whole problem? If there's historical reason to not use it in these contexts, that's fine, but it seems like a simple fix (I'd be more than willing to submit something for review for it) if not.

  8. vcapparelli commented on Mar 28, 2024

    @vcapparelli

    PR #6675
    @disconnect3d , the socket implementation was replaced by ipaddress, fixing the bugs

  9. disconnect3d commented on Mar 28, 2024

    @disconnect3d
    Author
  10. victorwss commented on Feb 7, 2025

    @victorwss

    We already have a PR and I think that it is ok. Can it be merged? If not, why?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions