net-ssh-backports 6.3.0.backports

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +93 -0
  3. data/.gitignore +13 -0
  4. data/.rubocop.yml +21 -0
  5. data/.rubocop_todo.yml +1074 -0
  6. data/.travis.yml +51 -0
  7. data/CHANGES.txt +698 -0
  8. data/Gemfile +13 -0
  9. data/Gemfile.noed25519 +12 -0
  10. data/ISSUE_TEMPLATE.md +30 -0
  11. data/LICENSE.txt +19 -0
  12. data/Manifest +132 -0
  13. data/README.md +287 -0
  14. data/Rakefile +105 -0
  15. data/THANKS.txt +110 -0
  16. data/appveyor.yml +58 -0
  17. data/lib/net/ssh/authentication/agent.rb +284 -0
  18. data/lib/net/ssh/authentication/certificate.rb +183 -0
  19. data/lib/net/ssh/authentication/constants.rb +20 -0
  20. data/lib/net/ssh/authentication/ed25519.rb +185 -0
  21. data/lib/net/ssh/authentication/ed25519_loader.rb +31 -0
  22. data/lib/net/ssh/authentication/key_manager.rb +297 -0
  23. data/lib/net/ssh/authentication/methods/abstract.rb +69 -0
  24. data/lib/net/ssh/authentication/methods/hostbased.rb +72 -0
  25. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +77 -0
  26. data/lib/net/ssh/authentication/methods/none.rb +34 -0
  27. data/lib/net/ssh/authentication/methods/password.rb +80 -0
  28. data/lib/net/ssh/authentication/methods/publickey.rb +95 -0
  29. data/lib/net/ssh/authentication/pageant.rb +497 -0
  30. data/lib/net/ssh/authentication/pub_key_fingerprint.rb +43 -0
  31. data/lib/net/ssh/authentication/session.rb +163 -0
  32. data/lib/net/ssh/buffer.rb +434 -0
  33. data/lib/net/ssh/buffered_io.rb +202 -0
  34. data/lib/net/ssh/config.rb +406 -0
  35. data/lib/net/ssh/connection/channel.rb +695 -0
  36. data/lib/net/ssh/connection/constants.rb +33 -0
  37. data/lib/net/ssh/connection/event_loop.rb +123 -0
  38. data/lib/net/ssh/connection/keepalive.rb +59 -0
  39. data/lib/net/ssh/connection/session.rb +712 -0
  40. data/lib/net/ssh/connection/term.rb +180 -0
  41. data/lib/net/ssh/errors.rb +106 -0
  42. data/lib/net/ssh/key_factory.rb +218 -0
  43. data/lib/net/ssh/known_hosts.rb +264 -0
  44. data/lib/net/ssh/loggable.rb +62 -0
  45. data/lib/net/ssh/packet.rb +106 -0
  46. data/lib/net/ssh/prompt.rb +62 -0
  47. data/lib/net/ssh/proxy/command.rb +123 -0
  48. data/lib/net/ssh/proxy/errors.rb +16 -0
  49. data/lib/net/ssh/proxy/http.rb +98 -0
  50. data/lib/net/ssh/proxy/https.rb +50 -0
  51. data/lib/net/ssh/proxy/jump.rb +54 -0
  52. data/lib/net/ssh/proxy/socks4.rb +67 -0
  53. data/lib/net/ssh/proxy/socks5.rb +140 -0
  54. data/lib/net/ssh/service/forward.rb +426 -0
  55. data/lib/net/ssh/test/channel.rb +147 -0
  56. data/lib/net/ssh/test/extensions.rb +173 -0
  57. data/lib/net/ssh/test/kex.rb +46 -0
  58. data/lib/net/ssh/test/local_packet.rb +53 -0
  59. data/lib/net/ssh/test/packet.rb +101 -0
  60. data/lib/net/ssh/test/remote_packet.rb +40 -0
  61. data/lib/net/ssh/test/script.rb +180 -0
  62. data/lib/net/ssh/test/socket.rb +65 -0
  63. data/lib/net/ssh/test.rb +94 -0
  64. data/lib/net/ssh/transport/algorithms.rb +502 -0
  65. data/lib/net/ssh/transport/cipher_factory.rb +103 -0
  66. data/lib/net/ssh/transport/constants.rb +40 -0
  67. data/lib/net/ssh/transport/ctr.rb +115 -0
  68. data/lib/net/ssh/transport/hmac/abstract.rb +97 -0
  69. data/lib/net/ssh/transport/hmac/md5.rb +10 -0
  70. data/lib/net/ssh/transport/hmac/md5_96.rb +9 -0
  71. data/lib/net/ssh/transport/hmac/none.rb +13 -0
  72. data/lib/net/ssh/transport/hmac/ripemd160.rb +11 -0
  73. data/lib/net/ssh/transport/hmac/sha1.rb +11 -0
  74. data/lib/net/ssh/transport/hmac/sha1_96.rb +9 -0
  75. data/lib/net/ssh/transport/hmac/sha2_256.rb +11 -0
  76. data/lib/net/ssh/transport/hmac/sha2_256_96.rb +9 -0
  77. data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
  78. data/lib/net/ssh/transport/hmac/sha2_512.rb +11 -0
  79. data/lib/net/ssh/transport/hmac/sha2_512_96.rb +9 -0
  80. data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
  81. data/lib/net/ssh/transport/hmac.rb +47 -0
  82. data/lib/net/ssh/transport/identity_cipher.rb +57 -0
  83. data/lib/net/ssh/transport/kex/abstract.rb +130 -0
  84. data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
  85. data/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
  86. data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
  87. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +37 -0
  88. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
  89. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +122 -0
  90. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +72 -0
  91. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +11 -0
  92. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +39 -0
  93. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +21 -0
  94. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +21 -0
  95. data/lib/net/ssh/transport/kex.rb +31 -0
  96. data/lib/net/ssh/transport/key_expander.rb +30 -0
  97. data/lib/net/ssh/transport/openssl.rb +253 -0
  98. data/lib/net/ssh/transport/packet_stream.rb +280 -0
  99. data/lib/net/ssh/transport/server_version.rb +77 -0
  100. data/lib/net/ssh/transport/session.rb +354 -0
  101. data/lib/net/ssh/transport/state.rb +208 -0
  102. data/lib/net/ssh/verifiers/accept_new.rb +33 -0
  103. data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +33 -0
  104. data/lib/net/ssh/verifiers/always.rb +58 -0
  105. data/lib/net/ssh/verifiers/never.rb +19 -0
  106. data/lib/net/ssh/version.rb +68 -0
  107. data/lib/net/ssh.rb +330 -0
  108. data/net-ssh-public_cert.pem +20 -0
  109. data/net-ssh.gemspec +44 -0
  110. data/support/ssh_tunnel_bug.rb +65 -0
  111. metadata +271 -0
@@ -0,0 +1,77 @@
1
+ require 'net/ssh/prompt'
2
+ require 'net/ssh/authentication/methods/abstract'
3
+
4
+ module Net
5
+ module SSH
6
+ module Authentication
7
+ module Methods
8
+ # Implements the "keyboard-interactive" SSH authentication method.
9
+ class KeyboardInteractive < Abstract
10
+ USERAUTH_INFO_REQUEST = 60
11
+ USERAUTH_INFO_RESPONSE = 61
12
+
13
+ # Attempt to authenticate the given user for the given service.
14
+ def authenticate(next_service, username, password=nil)
15
+ debug { "trying keyboard-interactive" }
16
+ send_message(userauth_request(username, next_service, "keyboard-interactive", "", ""))
17
+
18
+ prompter = nil
19
+ loop do
20
+ message = session.next_message
21
+
22
+ case message.type
23
+ when USERAUTH_SUCCESS
24
+ debug { "keyboard-interactive succeeded" }
25
+ prompter.success if prompter
26
+ return true
27
+ when USERAUTH_FAILURE
28
+ debug { "keyboard-interactive failed" }
29
+
30
+ raise Net::SSH::Authentication::DisallowedMethod unless
31
+ message[:authentications].split(/,/).include? 'keyboard-interactive'
32
+
33
+ return false unless interactive?
34
+
35
+ password = nil
36
+ debug { "retrying keyboard-interactive" }
37
+ send_message(userauth_request(username, next_service, "keyboard-interactive", "", ""))
38
+ when USERAUTH_INFO_REQUEST
39
+ name = message.read_string
40
+ instruction = message.read_string
41
+ debug { "keyboard-interactive info request" }
42
+
43
+ if password.nil? && interactive? && prompter.nil?
44
+ prompter = prompt.start(type: 'keyboard-interactive', name: name, instruction: instruction)
45
+ end
46
+
47
+ _ = message.read_string # lang_tag
48
+ responses = []
49
+
50
+ message.read_long.times do
51
+ text = message.read_string
52
+ echo = message.read_bool
53
+ password_to_send = password || (prompter && prompter.ask(text, echo))
54
+ responses << password_to_send
55
+ end
56
+
57
+ # if the password failed the first time around, don't try
58
+ # and use it on subsequent requests.
59
+ password = nil
60
+
61
+ msg = Buffer.from(:byte, USERAUTH_INFO_RESPONSE, :long, responses.length, :string, responses)
62
+ send_message(msg)
63
+ else
64
+ raise Net::SSH::Exception, "unexpected reply in keyboard interactive: #{message.type} (#{message.inspect})"
65
+ end
66
+ end
67
+ end
68
+
69
+ def interactive?
70
+ options = session.transport.options || {}
71
+ !options[:non_interactive]
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,34 @@
1
+ require 'net/ssh/errors'
2
+ require 'net/ssh/authentication/methods/abstract'
3
+
4
+ module Net
5
+ module SSH
6
+ module Authentication
7
+ module Methods
8
+ # Implements the "none" SSH authentication method.
9
+ class None < Abstract
10
+ # Attempt to authenticate as "none"
11
+ def authenticate(next_service, user="", password="")
12
+ send_message(userauth_request(user, next_service, "none"))
13
+ message = session.next_message
14
+
15
+ case message.type
16
+ when USERAUTH_SUCCESS
17
+ debug { "none succeeded" }
18
+ return true
19
+ when USERAUTH_FAILURE
20
+ debug { "none failed" }
21
+
22
+ raise Net::SSH::Authentication::DisallowedMethod unless
23
+ message[:authentications].split(/,/).include? 'none'
24
+
25
+ return false
26
+ else
27
+ raise Net::SSH::Exception, "unexpected reply to USERAUTH_REQUEST: #{message.type} (#{message.inspect})"
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,80 @@
1
+ require 'net/ssh/errors'
2
+ require 'net/ssh/prompt'
3
+ require 'net/ssh/authentication/methods/abstract'
4
+
5
+ module Net
6
+ module SSH
7
+ module Authentication
8
+ module Methods
9
+ # Implements the "password" SSH authentication method.
10
+ class Password < Abstract
11
+ # Attempt to authenticate the given user for the given service. If
12
+ # the password parameter is nil, this will ask for password
13
+ def authenticate(next_service, username, password=nil)
14
+ clear_prompter!
15
+ retries = 0
16
+ max_retries = get_max_retries
17
+ return false if !password && max_retries == 0
18
+
19
+ begin
20
+ password_to_send = password || ask_password(username)
21
+
22
+ send_message(userauth_request(username, next_service, "password", false, password_to_send))
23
+ message = session.next_message
24
+ retries += 1
25
+
26
+ if message.type == USERAUTH_FAILURE
27
+ debug { "password failed" }
28
+
29
+ raise Net::SSH::Authentication::DisallowedMethod unless
30
+ message[:authentications].split(/,/).include? 'password'
31
+
32
+ password = nil
33
+ end
34
+ end until (message.type != USERAUTH_FAILURE || retries >= max_retries)
35
+
36
+ case message.type
37
+ when USERAUTH_SUCCESS
38
+ debug { "password succeeded" }
39
+ @prompter.success if @prompter
40
+ return true
41
+ when USERAUTH_FAILURE
42
+ return false
43
+ when USERAUTH_PASSWD_CHANGEREQ
44
+ debug { "password change request received, failing" }
45
+ return false
46
+ else
47
+ raise Net::SSH::Exception, "unexpected reply to USERAUTH_REQUEST: #{message.type} (#{message.inspect})"
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ NUMBER_OF_PASSWORD_PROMPTS = 3
54
+
55
+ def clear_prompter!
56
+ @prompt_info = nil
57
+ @prompter = nil
58
+ end
59
+
60
+ def ask_password(username)
61
+ host = session.transport.host
62
+ prompt_info = { type: 'password', user: username, host: host }
63
+ if @prompt_info != prompt_info
64
+ @prompt_info = prompt_info
65
+ @prompter = prompt.start(prompt_info)
66
+ end
67
+ echo = false
68
+ @prompter.ask("#{username}@#{host}'s password:", echo)
69
+ end
70
+
71
+ def get_max_retries
72
+ options = session.transport.options || {}
73
+ result = options[:number_of_password_prompts] || NUMBER_OF_PASSWORD_PROMPTS
74
+ options[:non_interactive] ? 0 : result
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,95 @@
1
+ require 'net/ssh/buffer'
2
+ require 'net/ssh/errors'
3
+ require 'net/ssh/authentication/methods/abstract'
4
+
5
+ module Net
6
+ module SSH
7
+ module Authentication
8
+ module Methods
9
+ # Implements the "publickey" SSH authentication method.
10
+ class Publickey < Abstract
11
+ # Attempts to perform public-key authentication for the given
12
+ # username, trying each identity known to the key manager. If any of
13
+ # them succeed, returns +true+, otherwise returns +false+. This
14
+ # requires the presence of a key manager.
15
+ def authenticate(next_service, username, password=nil)
16
+ return false unless key_manager
17
+
18
+ key_manager.each_identity do |identity|
19
+ return true if authenticate_with(identity, next_service, username)
20
+ end
21
+
22
+ return false
23
+ end
24
+
25
+ private
26
+
27
+ # Builds a packet that contains the request formatted for sending
28
+ # a public-key request to the server.
29
+ def build_request(pub_key, username, next_service, has_sig)
30
+ blob = Net::SSH::Buffer.new
31
+ blob.write_key pub_key
32
+
33
+ userauth_request(username, next_service, "publickey", has_sig,
34
+ pub_key.ssh_type, blob.to_s)
35
+ end
36
+
37
+ # Builds and sends a request formatted for a public-key
38
+ # authentication request.
39
+ def send_request(pub_key, username, next_service, signature=nil)
40
+ msg = build_request(pub_key, username, next_service, !signature.nil?)
41
+ msg.write_string(signature) if signature
42
+ send_message(msg)
43
+ end
44
+
45
+ # Attempts to perform public-key authentication for the given
46
+ # username, with the given identity (public key). Returns +true+ if
47
+ # successful, or +false+ otherwise.
48
+ def authenticate_with(identity, next_service, username)
49
+ debug { "trying publickey (#{identity.fingerprint})" }
50
+ send_request(identity, username, next_service)
51
+
52
+ message = session.next_message
53
+
54
+ case message.type
55
+ when USERAUTH_PK_OK
56
+ buffer = build_request(identity, username, next_service, true)
57
+ sig_data = Net::SSH::Buffer.new
58
+ sig_data.write_string(session_id)
59
+ sig_data.append(buffer.to_s)
60
+
61
+ sig_blob = key_manager.sign(identity, sig_data)
62
+
63
+ send_request(identity, username, next_service, sig_blob.to_s)
64
+ message = session.next_message
65
+
66
+ case message.type
67
+ when USERAUTH_SUCCESS
68
+ debug { "publickey succeeded (#{identity.fingerprint})" }
69
+ return true
70
+ when USERAUTH_FAILURE
71
+ debug { "publickey failed (#{identity.fingerprint})" }
72
+
73
+ raise Net::SSH::Authentication::DisallowedMethod unless
74
+ message[:authentications].split(/,/).include? 'publickey'
75
+
76
+ return false
77
+ else
78
+ raise Net::SSH::Exception,
79
+ "unexpected server response to USERAUTH_REQUEST: #{message.type} (#{message.inspect})"
80
+ end
81
+
82
+ when USERAUTH_FAILURE
83
+ return false
84
+ when USERAUTH_SUCCESS
85
+ return true
86
+
87
+ else
88
+ raise Net::SSH::Exception, "unexpected reply to USERAUTH_REQUEST: #{message.type} (#{message.inspect})"
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end