OpenSSH 2.9 as of 2001/5/15
This commit is contained in:
parent
09ba301f07
commit
72af75e4ce
|
@ -1,567 +1,25 @@
|
||||||
|
This release of OpenSSH is for OpenBSD systems only.
|
||||||
[ Please note that this file has not been updated for OpenSSH and
|
|
||||||
covers the ssh-1.2.12 release from Dec 1995 only. ]
|
Please read
|
||||||
|
http://www.openssh.com/portable.html
|
||||||
Ssh (Secure Shell) is a program to log into another computer over a
|
if you want to install OpenSSH on other operating systems.
|
||||||
network, to execute commands in a remote machine, and to move files
|
|
||||||
from one machine to another. It provides strong authentication and
|
To extract and install this release on your OpenBSD system use:
|
||||||
secure communications over insecure channels. It is intended as a
|
|
||||||
replacement for rlogin, rsh, rcp, and rdist.
|
# cd /usr/src/usr.bin
|
||||||
|
# tar xvfz .../openssh-x.y.tgz
|
||||||
See the file INSTALL for installation instructions. See COPYING for
|
# cd ssh
|
||||||
license terms and other legal issues. See RFC for a description of
|
# make obj
|
||||||
the protocol. There is a WWW page for ssh; see http://www.cs.hut.fi/ssh.
|
# make cleandir
|
||||||
|
# make depend
|
||||||
This file has been updated to match ssh-1.2.12.
|
# make
|
||||||
|
# make install
|
||||||
|
# cp ssh_config sshd_config /etc
|
||||||
FEATURES
|
|
||||||
|
OpenSSH is a derivative of the original and free ssh 1.2.12 release
|
||||||
o Strong authentication. Closes several security holes (e.g., IP,
|
by Tatu Ylonen. Aaron Campbell, Bob Beck, Markus Friedl, Niels
|
||||||
routing, and DNS spoofing). New authentication methods: .rhosts
|
Provos, Theo de Raadt and Dug Song removed many bugs, re-added newer
|
||||||
together with RSA based host authentication, and pure RSA
|
features and created OpenSSH. Markus Friedl contributed the support
|
||||||
authentication.
|
for SSH protocol versions 1.5 and 2.0.
|
||||||
|
|
||||||
o Improved privacy. All communications are automatically and
|
See http://www.openssh.com/ for more information.
|
||||||
transparently encrypted. RSA is used for key exchange, and a
|
|
||||||
conventional cipher (normally IDEA, DES, or triple-DES) for
|
|
||||||
encrypting the session. Encryption is started before
|
|
||||||
authentication, and no passwords or other information is
|
|
||||||
transmitted in the clear. Encryption is also used to protect
|
|
||||||
against spoofed packets.
|
|
||||||
|
|
||||||
o Secure X11 sessions. The program automatically sets DISPLAY on
|
|
||||||
the server machine, and forwards any X11 connections over the
|
|
||||||
secure channel. Fake Xauthority information is automatically
|
|
||||||
generated and forwarded to the remote machine; the local client
|
|
||||||
automatically examines incoming X11 connections and replaces the
|
|
||||||
fake authorization data with the real data (never telling the
|
|
||||||
remote machine the real information).
|
|
||||||
|
|
||||||
o Arbitrary TCP/IP ports can be redirected through the encrypted channel
|
|
||||||
in both directions (e.g., for e-cash transactions).
|
|
||||||
|
|
||||||
o No retraining needed for normal users; everything happens
|
|
||||||
automatically, and old .rhosts files will work with strong
|
|
||||||
authentication if administration installs host key files.
|
|
||||||
|
|
||||||
o Never trusts the network. Minimal trust on the remote side of
|
|
||||||
the connection. Minimal trust on domain name servers. Pure RSA
|
|
||||||
authentication never trusts anything but the private key.
|
|
||||||
|
|
||||||
o Client RSA-authenticates the server machine in the beginning of
|
|
||||||
every connection to prevent trojan horses (by routing or DNS
|
|
||||||
spoofing) and man-in-the-middle attacks, and the server
|
|
||||||
RSA-authenticates the client machine before accepting .rhosts or
|
|
||||||
/etc/hosts.equiv authentication (to prevent DNS, routing, or
|
|
||||||
IP-spoofing).
|
|
||||||
|
|
||||||
o Host authentication key distribution can be centrally by the
|
|
||||||
administration, automatically when the first connection is made
|
|
||||||
to a machine (the key obtained on the first connection will be
|
|
||||||
recorded and used for authentication in the future), or manually
|
|
||||||
by each user for his/her own use. The central and per-user host
|
|
||||||
key repositories are both used and complement each other. Host
|
|
||||||
keys can be generated centrally or automatically when the software
|
|
||||||
is installed. Host authentication keys are typically 1024 bits.
|
|
||||||
|
|
||||||
o Any user can create any number of user authentication RSA keys for
|
|
||||||
his/her own use. Each user has a file which lists the RSA public
|
|
||||||
keys for which proof of possession of the corresponding private
|
|
||||||
key is accepted as authentication. User authentication keys are
|
|
||||||
typically 1024 bits.
|
|
||||||
|
|
||||||
o The server program has its own server RSA key which is
|
|
||||||
automatically regenerated every hour. This key is never saved in
|
|
||||||
any file. Exchanged session keys are encrypted using both the
|
|
||||||
server key and the server host key. The purpose of the separate
|
|
||||||
server key is to make it impossible to decipher a captured session by
|
|
||||||
breaking into the server machine at a later time; one hour from
|
|
||||||
the connection even the server machine cannot decipher the session
|
|
||||||
key. The key regeneration interval is configurable. The server
|
|
||||||
key is normally 768 bits.
|
|
||||||
|
|
||||||
o An authentication agent, running in the user's laptop or local
|
|
||||||
workstation, can be used to hold the user's RSA authentication
|
|
||||||
keys. Ssh automatically forwards the connection to the
|
|
||||||
authentication agent over any connections, and there is no need to
|
|
||||||
store the RSA authentication keys on any machine in the network
|
|
||||||
(except the user's own local machine). The authentication
|
|
||||||
protocols never reveal the keys; they can only be used to verify
|
|
||||||
that the user's agent has a certain key. Eventually the agent
|
|
||||||
could rely on a smart card to perform all authentication
|
|
||||||
computations.
|
|
||||||
|
|
||||||
o The software can be installed and used (with restricted
|
|
||||||
functionality) even without root privileges.
|
|
||||||
|
|
||||||
o The client is customizable in system-wide and per-user
|
|
||||||
configuration files. Most aspects of the client's operation can
|
|
||||||
be configured. Different options can be specified on a per-host basis.
|
|
||||||
|
|
||||||
o Automatically executes conventional rsh (after displaying a
|
|
||||||
warning) if the server machine is not running sshd.
|
|
||||||
|
|
||||||
o Optional compression of all data with gzip (including forwarded X11
|
|
||||||
and TCP/IP port data), which may result in significant speedups on
|
|
||||||
slow connections.
|
|
||||||
|
|
||||||
o Complete replacement for rlogin, rsh, and rcp.
|
|
||||||
|
|
||||||
|
|
||||||
WHY TO USE SECURE SHELL
|
|
||||||
|
|
||||||
Currently, almost all communications in computer networks are done
|
|
||||||
without encryption. As a consequence, anyone who has access to any
|
|
||||||
machine connected to the network can listen in on any communication.
|
|
||||||
This is being done by hackers, curious administrators, employers,
|
|
||||||
criminals, industrial spies, and governments. Some networks leak off
|
|
||||||
enough electromagnetic radiation that data may be captured even from a
|
|
||||||
distance.
|
|
||||||
|
|
||||||
When you log in, your password goes in the network in plain
|
|
||||||
text. Thus, any listener can then use your account to do any evil he
|
|
||||||
likes. Many incidents have been encountered worldwide where crackers
|
|
||||||
have started programs on workstations without the owners knowledge
|
|
||||||
just to listen to the network and collect passwords. Programs for
|
|
||||||
doing this are available on the Internet, or can be built by a
|
|
||||||
competent programmer in a few hours.
|
|
||||||
|
|
||||||
Any information that you type or is printed on your screen can be
|
|
||||||
monitored, recorded, and analyzed. For example, an intruder who has
|
|
||||||
penetrated a host connected to a major network can start a program
|
|
||||||
that listens to all data flowing in the network, and whenever it
|
|
||||||
encounters a 16-digit string, it checks if it is a valid credit card
|
|
||||||
number (using the check digit), and saves the number plus any
|
|
||||||
surrounding text (to catch expiration date and holder) in a file.
|
|
||||||
When the intruder has collected a few thousand credit card numbers, he
|
|
||||||
makes smallish mail-order purchases from a few thousand stores around
|
|
||||||
the world, and disappears when the goods arrive but before anyone
|
|
||||||
suspects anything.
|
|
||||||
|
|
||||||
Businesses have trade secrets, patent applications in preparation,
|
|
||||||
pricing information, subcontractor information, client data, personnel
|
|
||||||
data, financial information, etc. Currently, anyone with access to
|
|
||||||
the network (any machine on the network) can listen to anything that
|
|
||||||
goes in the network, without any regard to normal access restrictions.
|
|
||||||
|
|
||||||
Many companies are not aware that information can so easily be
|
|
||||||
recovered from the network. They trust that their data is safe
|
|
||||||
since nobody is supposed to know that there is sensitive information
|
|
||||||
in the network, or because so much other data is transferred in the
|
|
||||||
network. This is not a safe policy.
|
|
||||||
|
|
||||||
Individual persons also have confidential information, such as
|
|
||||||
diaries, love letters, health care documents, information about their
|
|
||||||
personal interests and habits, professional data, job applications,
|
|
||||||
tax reports, political documents, unpublished manuscripts, etc.
|
|
||||||
|
|
||||||
One should also be aware that economical intelligence and industrial
|
|
||||||
espionage has recently become a major priority of the intelligence
|
|
||||||
agencies of major governments. President Clinton recently assigned
|
|
||||||
economical espionage as the primary task of the CIA, and the French
|
|
||||||
have repeatedly been publicly boasting about their achievements on
|
|
||||||
this field.
|
|
||||||
|
|
||||||
|
|
||||||
There is also another frightening aspect about the poor security of
|
|
||||||
communications. Computer storage and analysis capability has
|
|
||||||
increased so much that it is feasible for governments, major
|
|
||||||
companies, and criminal organizations to automatically analyze,
|
|
||||||
identify, classify, and file information about millions of people over
|
|
||||||
the years. Because most of the work can be automated, the cost of
|
|
||||||
collecting this information is getting very low.
|
|
||||||
|
|
||||||
Government agencies may be able to monitor major communication
|
|
||||||
systems, telephones, fax, computer networks, etc., and passively
|
|
||||||
collect huge amounts of information about all people with any
|
|
||||||
significant position in the society. Most of this information is not
|
|
||||||
sensitive, and many people would say there is no harm in someone
|
|
||||||
getting that information. However, the information starts to get
|
|
||||||
sensitive when someone has enough of it. You may not mind someone
|
|
||||||
knowing what you bought from the shop one random day, but you might
|
|
||||||
not like someone knowing every small thing you have bought in the last
|
|
||||||
ten years.
|
|
||||||
|
|
||||||
If the government some day starts to move into a more totalitarian
|
|
||||||
direction (one should remember that Nazi Germany was created by
|
|
||||||
democratic elections), there is considerable danger of an ultimate
|
|
||||||
totalitarian state. With enough information (the automatically
|
|
||||||
collected records of an individual can be manually analyzed when the
|
|
||||||
person becomes interesting), one can form a very detailed picture of
|
|
||||||
the individual's interests, opinions, beliefs, habits, friends,
|
|
||||||
lovers, weaknesses, etc. This information can be used to 1) locate
|
|
||||||
any persons who might oppose the new system 2) use deception to
|
|
||||||
disturb any organizations which might rise against the government 3)
|
|
||||||
eliminate difficult individuals without anyone understanding what
|
|
||||||
happened. Additionally, if the government can monitor communications
|
|
||||||
too effectively, it becomes too easy to locate and eliminate any
|
|
||||||
persons distributing information contrary to the official truth.
|
|
||||||
|
|
||||||
Fighting crime and terrorism are often used as grounds for domestic
|
|
||||||
surveillance and restricting encryption. These are good goals, but
|
|
||||||
there is considerable danger that the surveillance data starts to get
|
|
||||||
used for questionable purposes. I find that it is better to tolerate
|
|
||||||
a small amount of crime in the society than to let the society become
|
|
||||||
fully controlled. I am in favor of a fairly strong state, but the
|
|
||||||
state must never get so strong that people become unable to spread
|
|
||||||
contra-offical information and unable to overturn the government if it
|
|
||||||
is bad. The danger is that when you notice that the government is
|
|
||||||
too powerful, it is too late. Also, the real power may not be where
|
|
||||||
the official government is.
|
|
||||||
|
|
||||||
For these reasons (privacy, protecting trade secrets, and making it
|
|
||||||
more difficult to create a totalitarian state), I think that strong
|
|
||||||
cryptography should be integrated to the tools we use every day.
|
|
||||||
Using it causes no harm (except for those who wish to monitor
|
|
||||||
everything), but not using it can cause huge problems. If the society
|
|
||||||
changes in undesirable ways, then it will be to late to start
|
|
||||||
encrypting.
|
|
||||||
|
|
||||||
Encryption has had a "military" or "classified" flavor to it. There
|
|
||||||
are no longer any grounds for this. The military can and will use its
|
|
||||||
own encryption; that is no excuse to prevent the civilians from
|
|
||||||
protecting their privacy and secrets. Information on strong
|
|
||||||
encryption is available in every major bookstore, scientific library,
|
|
||||||
and patent office around the world, and strong encryption software is
|
|
||||||
available in every country on the Internet.
|
|
||||||
|
|
||||||
Some people would like to make it illegal to use encryption, or to
|
|
||||||
force people to use encryption that governments can break. This
|
|
||||||
approach offers no protection if the government turns bad. Also, the
|
|
||||||
"bad guys" will be using true strong encryption anyway. Good
|
|
||||||
encryption techniques are too widely known to make them disappear.
|
|
||||||
Thus, any "key escrow encryption" or other restrictions will only help
|
|
||||||
monitor ordinary people and petty criminals. It does not help against
|
|
||||||
powerful criminals, terrorists, or espionage, because they will know
|
|
||||||
how to use strong encryption anyway. (One source for internationally
|
|
||||||
available encryption software is http://www.cs.hut.fi/crypto.)
|
|
||||||
|
|
||||||
|
|
||||||
OVERVIEW OF SECURE SHELL
|
|
||||||
|
|
||||||
The software consists of a number of programs.
|
|
||||||
|
|
||||||
sshd Server program run on the server machine. This
|
|
||||||
listens for connections from client machines, and
|
|
||||||
whenever it receives a connection, it performs
|
|
||||||
authentication and starts serving the client.
|
|
||||||
|
|
||||||
ssh This is the client program used to log into another
|
|
||||||
machine or to execute commands on the other machine.
|
|
||||||
"slogin" is another name for this program.
|
|
||||||
|
|
||||||
scp Securely copies files from one machine to another.
|
|
||||||
|
|
||||||
ssh-keygen Used to create RSA keys (host keys and user
|
|
||||||
authentication keys).
|
|
||||||
|
|
||||||
ssh-agent Authentication agent. This can be used to hold RSA
|
|
||||||
keys for authentication.
|
|
||||||
|
|
||||||
ssh-add Used to register new keys with the agent.
|
|
||||||
|
|
||||||
make-ssh-known-hosts
|
|
||||||
Used to create the /etc/ssh_known_hosts file.
|
|
||||||
|
|
||||||
|
|
||||||
Ssh is the program users normally use. It is started as
|
|
||||||
|
|
||||||
ssh host
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
ssh host command
|
|
||||||
|
|
||||||
The first form opens a new shell on the remote machine (after
|
|
||||||
authentication). The latter form executes the command on the remote
|
|
||||||
machine.
|
|
||||||
|
|
||||||
When started, the ssh connects sshd on the server machine, verifies
|
|
||||||
that the server machine really is the machine it wanted to connect,
|
|
||||||
exchanges encryption keys (in a manner which prevents an outside
|
|
||||||
listener from getting the keys), performs authentication using .rhosts
|
|
||||||
and /etc/hosts.equiv, RSA authentication, or conventional password
|
|
||||||
based authentication. The server then (normally) allocates a
|
|
||||||
pseudo-terminal and starts an interactive shell or user program.
|
|
||||||
|
|
||||||
The TERM environment variable (describing the type of the user's
|
|
||||||
terminal) is passed from the client side to the remote side. Also,
|
|
||||||
terminal modes will be copied from the client side to the remote side
|
|
||||||
to preserve user preferences (e.g., the erase character).
|
|
||||||
|
|
||||||
If the DISPLAY variable is set on the client side, the server will
|
|
||||||
create a dummy X server and set DISPLAY accordingly. Any connections
|
|
||||||
to the dummy X server will be forwarded through the secure channel,
|
|
||||||
and will be made to the real X server from the client side. An
|
|
||||||
arbitrary number of X programs can be started during the session, and
|
|
||||||
starting them does not require anything special from the user. (Note
|
|
||||||
that the user must not manually set DISPLAY, because then it would
|
|
||||||
connect directly to the real display instead of going through the
|
|
||||||
encrypted channel). This behavior can be disabled in the
|
|
||||||
configuration file or by giving the -x option to the client.
|
|
||||||
|
|
||||||
Arbitrary IP ports can be forwarded over the secure channel. The
|
|
||||||
program then creates a port on one side, and whenever a connection is
|
|
||||||
opened to this port, it will be passed over the secure channel, and a
|
|
||||||
connection will be made from the other side to a specified host:port
|
|
||||||
pair. Arbitrary IP forwarding must always be explicitly requested,
|
|
||||||
and cannot be used to forward privileged ports (unless the user is
|
|
||||||
root). It is possible to specify automatic forwards in a per-user
|
|
||||||
configuration file, for example to make electronic cash systems work
|
|
||||||
securely.
|
|
||||||
|
|
||||||
If there is an authentication agent on the client side, connection to
|
|
||||||
it will be automatically forwarded to the server side.
|
|
||||||
|
|
||||||
For more infomation, see the manual pages ssh(1), sshd(8), scp(1),
|
|
||||||
ssh-keygen(1), ssh-agent(1), ssh-add(1), and make-ssh-known-hosts(1)
|
|
||||||
included in this distribution.
|
|
||||||
|
|
||||||
|
|
||||||
X11 CONNECTION FORWARDING
|
|
||||||
|
|
||||||
X11 forwarding serves two purposes: it is a convenience to the user
|
|
||||||
because there is no need to set the DISPLAY variable, and it provides
|
|
||||||
encrypted X11 connections. I cannot think of any other easy way to
|
|
||||||
make X11 connections encrypted; modifying the X server, clients or
|
|
||||||
libraries would require special work for each machine, vendor and
|
|
||||||
application. Widely used IP-level encryption does not seem likely for
|
|
||||||
several years. Thus what we have left is faking an X server on the
|
|
||||||
same machine where the clients are run, and forwarding the connections
|
|
||||||
to a real X server over the secure channel.
|
|
||||||
|
|
||||||
X11 forwarding works as follows. The client extracts Xauthority
|
|
||||||
information for the server. It then creates random authorization
|
|
||||||
data, and sends the random data to the server. The server allocates
|
|
||||||
an X11 display number, and stores the (fake) Xauthority data for this
|
|
||||||
display. Whenever an X11 connection is opened, the server forwards
|
|
||||||
the connection over the secure channel to the client, and the client
|
|
||||||
parses the first packet of the X11 protocol, substitutes real
|
|
||||||
authentication data for the fake data (if the fake data matched), and
|
|
||||||
forwards the connection to the real X server.
|
|
||||||
|
|
||||||
If the display does not have Xauthority data, the server will create a
|
|
||||||
unix domain socket in /tmp/.X11-unix, and use the unix domain socket
|
|
||||||
as the display. No authentication information is forwarded in this
|
|
||||||
case. X11 connections are again forwarded over the secure channel.
|
|
||||||
To the X server the connections appear to come from the client
|
|
||||||
machine, and the server must have connections allowed from the local
|
|
||||||
machine. Using authentication data is always recommended because not
|
|
||||||
using it makes the display insecure. If XDM is used, it automatically
|
|
||||||
generates the authentication data.
|
|
||||||
|
|
||||||
One should be careful not to use "xin" or "xstart" or other similar
|
|
||||||
scripts that explicitly set DISPLAY to start X sessions in a remote
|
|
||||||
machine, because the connection will then not go over the secure
|
|
||||||
channel. The recommended way to start a shell in a remote machine is
|
|
||||||
|
|
||||||
xterm -e ssh host &
|
|
||||||
|
|
||||||
and the recommended way to execute an X11 application in a remote
|
|
||||||
machine is
|
|
||||||
|
|
||||||
ssh -n host emacs &
|
|
||||||
|
|
||||||
If you need to type a password/passphrase for the remote machine,
|
|
||||||
|
|
||||||
ssh -f host emacs
|
|
||||||
|
|
||||||
may be useful.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
RSA AUTHENTICATION
|
|
||||||
|
|
||||||
RSA authentication is based on public key cryptograpy. The idea is
|
|
||||||
that there are two encryption keys, one for encryption and another for
|
|
||||||
decryption. It is not possible (on human timescale) to derive the
|
|
||||||
decryption key from the encryption key. The encryption key is called
|
|
||||||
the public key, because it can be given to anyone and it is not
|
|
||||||
secret. The decryption key, on the other hand, is secret, and is
|
|
||||||
called the private key.
|
|
||||||
|
|
||||||
RSA authentication is based on the impossibility of deriving the
|
|
||||||
private key from the public key. The public key is stored on the
|
|
||||||
server machine in the user's $HOME/.ssh/authorized_keys file. The
|
|
||||||
private key is only kept on the user's local machine, laptop, or other
|
|
||||||
secure storage. Then the user tries to log in, the client tells the
|
|
||||||
server the public key that the user wishes to use for authentication.
|
|
||||||
The server then checks if this public key is admissible. If so, it
|
|
||||||
generates a 256 bit random number, encrypts it with the public key,
|
|
||||||
and sends the value to the client. The client then decrypts the
|
|
||||||
number with its private key, computes a 128 bit MD5 checksum from the
|
|
||||||
resulting data, and sends the checksum back to the server. (Only a
|
|
||||||
checksum is sent to prevent chosen-plaintext attacks against RSA.)
|
|
||||||
The server checks computes a checksum from the correct data,
|
|
||||||
and compares the checksums. Authentication is accepted if the
|
|
||||||
checksums match. (Theoretically this indicates that the client
|
|
||||||
only probably knows the correct key, but for all practical purposes
|
|
||||||
there is no doubt.)
|
|
||||||
|
|
||||||
The RSA private key can be protected with a passphrase. The
|
|
||||||
passphrase can be any string; it is hashed with MD5 to produce an
|
|
||||||
encryption key for IDEA, which is used to encrypt the private part of
|
|
||||||
the key file. With passphrase, authorization requires access to the key
|
|
||||||
file and the passphrase. Without passphrase, authorization only
|
|
||||||
depends on possession of the key file.
|
|
||||||
|
|
||||||
RSA authentication is the most secure form of authentication supported
|
|
||||||
by this software. It does not rely on the network, routers, domain
|
|
||||||
name servers, or the client machine. The only thing that matters is
|
|
||||||
access to the private key.
|
|
||||||
|
|
||||||
All this, of course, depends on the security of the RSA algorithm
|
|
||||||
itself. RSA has been widely known since about 1978, and no effective
|
|
||||||
methods for breaking it are known if it is used properly. Care has
|
|
||||||
been taken to avoid the well-known pitfalls. Breaking RSA is widely
|
|
||||||
believed to be equivalent to factoring, which is a very hard
|
|
||||||
mathematical problem that has received considerable public research.
|
|
||||||
So far, no effective methods are known for numbers bigger than about
|
|
||||||
512 bits. However, as computer speeds and factoring methods are
|
|
||||||
increasing, 512 bits can no longer be considered secure. The
|
|
||||||
factoring work is exponential, and 768 or 1024 bits are widely
|
|
||||||
considered to be secure in the near future.
|
|
||||||
|
|
||||||
|
|
||||||
RHOSTS AUTHENTICATION
|
|
||||||
|
|
||||||
Conventional .rhosts and hosts.equiv based authentication mechanisms
|
|
||||||
are fundamentally insecure due to IP, DNS (domain name server) and
|
|
||||||
routing spoofing attacks. Additionally this authentication method
|
|
||||||
relies on the integrity of the client machine. These weaknesses is
|
|
||||||
tolerable, and been known and exploited for a long time.
|
|
||||||
|
|
||||||
Ssh provides an improved version of these types of authentication,
|
|
||||||
because they are very convenient for the user (and allow easy
|
|
||||||
transition from rsh and rlogin). It permits these types of
|
|
||||||
authentication, but additionally requires that the client host be
|
|
||||||
authenticated using RSA.
|
|
||||||
|
|
||||||
The server has a list of host keys stored in /etc/ssh_known_host, and
|
|
||||||
additionally each user has host keys in $HOME/.ssh/known_hosts. Ssh
|
|
||||||
uses the name servers to obtain the canonical name of the client host,
|
|
||||||
looks for its public key in its known host files, and requires the
|
|
||||||
client to prove that it knows the private host key. This prevents IP
|
|
||||||
and routing spoofing attacks (as long as the client machine private
|
|
||||||
host key has not been compromized), but is still vulnerable to DNS
|
|
||||||
attacks (to a limited extent), and relies on the integrity of the
|
|
||||||
client machine as to who is requesting to log in. This prevents
|
|
||||||
outsiders from attacking, but does not protect against very powerful
|
|
||||||
attackers. If maximal security is desired, only RSA authentication
|
|
||||||
should be used.
|
|
||||||
|
|
||||||
It is possible to enable conventional .rhosts and /etc/hosts.equiv
|
|
||||||
authentication (without host authentication) at compile time by giving
|
|
||||||
the option --with-rhosts to configure. However, this is not
|
|
||||||
recommended, and is not done by default.
|
|
||||||
|
|
||||||
These weaknesses are present in rsh and rlogin. No improvement in
|
|
||||||
security will be obtained unless rlogin and rsh are completely
|
|
||||||
disabled (commented out in /etc/inetd.conf). This is highly
|
|
||||||
recommended.
|
|
||||||
|
|
||||||
|
|
||||||
WEAKEST LINKS IN SECURITY
|
|
||||||
|
|
||||||
One should understand that while this software may provide
|
|
||||||
cryptographically secure communications, it may be easy to
|
|
||||||
monitor the communications at their endpoints.
|
|
||||||
|
|
||||||
Basically, anyone with root access on the local machine on which you
|
|
||||||
are running the software may be able to do anything. Anyone with root
|
|
||||||
access on the server machine may be able to monitor your
|
|
||||||
communications, and a very talented root user might even be able to
|
|
||||||
send his/her own requests to your authentication agent.
|
|
||||||
|
|
||||||
One should also be aware that computers send out electromagnetic
|
|
||||||
radition that can sometimes be picked up hundreds of meters away.
|
|
||||||
Your keyboard is particularly easy to listen to. The image on your
|
|
||||||
monitor might also be seen on another monitor in a van parked behind
|
|
||||||
your house.
|
|
||||||
|
|
||||||
Beware that unwanted visitors might come to your home or office and
|
|
||||||
use your machine while you are away. They might also make
|
|
||||||
modifications or install bugs in your hardware or software.
|
|
||||||
|
|
||||||
Beware that the most effective way for someone to decrypt your data
|
|
||||||
may be with a rubber hose.
|
|
||||||
|
|
||||||
|
|
||||||
LEGAL ISSUES
|
|
||||||
|
|
||||||
As far as I am concerned, anyone is permitted to use this software
|
|
||||||
freely. However, see the file COPYING for detailed copying,
|
|
||||||
licensing, and distribution information.
|
|
||||||
|
|
||||||
In some countries, particularly France, Russia, Iraq, and Pakistan,
|
|
||||||
it may be illegal to use any encryption at all without a special
|
|
||||||
permit, and the rumor has it that you cannot get a permit for any
|
|
||||||
strong encryption.
|
|
||||||
|
|
||||||
This software may be freely imported into the United States; however,
|
|
||||||
the United States Government may consider re-exporting it a criminal
|
|
||||||
offence.
|
|
||||||
|
|
||||||
Note that any information and cryptographic algorithms used in this
|
|
||||||
software are publicly available on the Internet and at any major
|
|
||||||
bookstore, scientific library, or patent office worldwide.
|
|
||||||
|
|
||||||
THERE IS NO WARRANTY FOR THIS PROGRAM. Please consult the file
|
|
||||||
COPYING for more information.
|
|
||||||
|
|
||||||
|
|
||||||
MAILING LISTS AND OTHER INFORMATION
|
|
||||||
|
|
||||||
There is a mailing list for ossh. It is ossh@sics.se. If you would
|
|
||||||
like to join, send a message to majordomo@sics.se with "subscribe
|
|
||||||
ssh" in body.
|
|
||||||
|
|
||||||
The WWW home page for ssh is http://www.cs.hut.fi/ssh. It contains an
|
|
||||||
archive of the mailing list, and detailed information about new
|
|
||||||
releases, mailing lists, and other relevant issues.
|
|
||||||
|
|
||||||
Bug reports should be sent to ossh-bugs@sics.se.
|
|
||||||
|
|
||||||
|
|
||||||
ABOUT THE AUTHOR
|
|
||||||
|
|
||||||
This software was written by Tatu Ylonen <ylo@cs.hut.fi>. I work as a
|
|
||||||
researcher at Helsinki University of Technology, Finland. For more
|
|
||||||
information, see http://www.cs.hut.fi/~ylo/. My PGP public key is
|
|
||||||
available via finger from ylo@cs.hut.fi and from the key servers. I
|
|
||||||
prefer PGP encrypted mail.
|
|
||||||
|
|
||||||
The author can be contacted via ordinary mail at
|
|
||||||
Tatu Ylonen
|
|
||||||
Helsinki University of Technology
|
|
||||||
Otakaari 1
|
|
||||||
FIN-02150 ESPOO
|
|
||||||
Finland
|
|
||||||
|
|
||||||
Fax. +358-0-4513293
|
|
||||||
|
|
||||||
|
|
||||||
ACKNOWLEDGEMENTS
|
|
||||||
|
|
||||||
I thank Tero Kivinen, Timo Rinne, Janne Snabb, and Heikki Suonsivu for
|
|
||||||
their help and comments in the design, implementation and porting of
|
|
||||||
this software. I also thank numerous contributors, including but not
|
|
||||||
limited to Walker Aumann, Jurgen Botz, Hans-Werner Braun, Stephane
|
|
||||||
Bortzmeyer, Adrian Colley, Michael Cooper, David Dombek, Jerome
|
|
||||||
Etienne, Bill Fithen, Mark Fullmer, Bert Gijsbers, Andreas Gustafsson,
|
|
||||||
Michael Henits, Steve Johnson, Thomas Koenig, Felix Leitner, Gunnar
|
|
||||||
Lindberg, Andrew Macpherson, Marc Martinec, Paul Mauvais, Donald
|
|
||||||
McKillican, Leon Mlakar, Robert Muchsel, Mark Treacy, Bryan
|
|
||||||
O'Sullivan, Mikael Suokas, Ollivier Robert, Jakob Schlyter, Tomasz
|
|
||||||
Surmacz, Alvar Vinacua, Petri Virkkula, Michael Warfield, and
|
|
||||||
Cristophe Wolfhugel.
|
|
||||||
|
|
||||||
Thanks also go to Philip Zimmermann, whose PGP software and the
|
|
||||||
associated legal battle provided inspiration, motivation, and many
|
|
||||||
useful techniques, and to Bruce Schneier whose book Applied
|
|
||||||
Cryptography has done a great service in widely distributing knowledge
|
|
||||||
about cryptographic methods.
|
|
||||||
|
|
||||||
|
|
||||||
Copyright (c) 1995 Tatu Ylonen, Espoo, Finland.
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: buffer.c,v 1.1.1.4 2001/04/10 07:13:51 itojun Exp $ */
|
/* $NetBSD: buffer.c,v 1.1.1.5 2001/05/15 15:02:25 itojun Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -13,7 +13,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
RCSID("$OpenBSD: buffer.c,v 1.12 2001/04/07 08:55:15 markus Exp $");
|
RCSID("$OpenBSD: buffer.c,v 1.13 2001/04/12 19:15:24 markus Exp $");
|
||||||
|
|
||||||
#include "xmalloc.h"
|
#include "xmalloc.h"
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
|
@ -155,7 +155,12 @@ buffer_dump(Buffer *buffer)
|
||||||
int i;
|
int i;
|
||||||
u_char *ucp = (u_char *) buffer->buf;
|
u_char *ucp = (u_char *) buffer->buf;
|
||||||
|
|
||||||
for (i = buffer->offset; i < buffer->end; i++)
|
for (i = buffer->offset; i < buffer->end; i++) {
|
||||||
fprintf(stderr, " %02x", ucp[i]);
|
fprintf(stderr, "%02x", ucp[i]);
|
||||||
|
if ((i-buffer->offset)%16==15)
|
||||||
|
fprintf(stderr, "\r\n");
|
||||||
|
else if ((i-buffer->offset)%2==1)
|
||||||
|
fprintf(stderr, " ");
|
||||||
|
}
|
||||||
fprintf(stderr, "\r\n");
|
fprintf(stderr, "\r\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: channels.h,v 1.1.1.6 2001/04/10 07:13:53 itojun Exp $ */
|
/* $NetBSD: channels.h,v 1.1.1.7 2001/05/15 15:02:26 itojun Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
/* RCSID("$OpenBSD: channels.h,v 1.30 2001/04/07 08:55:17 markus Exp $"); */
|
/* RCSID("$OpenBSD: channels.h,v 1.32 2001/05/04 23:47:33 markus Exp $"); */
|
||||||
|
|
||||||
#ifndef CHANNELS_H
|
#ifndef CHANNELS_H
|
||||||
#define CHANNELS_H
|
#define CHANNELS_H
|
||||||
|
@ -41,7 +41,6 @@
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
|
|
||||||
/* Definitions for channel types. */
|
/* Definitions for channel types. */
|
||||||
#define SSH_CHANNEL_FREE 0 /* This channel is free (unused). */
|
|
||||||
#define SSH_CHANNEL_X11_LISTENER 1 /* Listening for inet X11 conn. */
|
#define SSH_CHANNEL_X11_LISTENER 1 /* Listening for inet X11 conn. */
|
||||||
#define SSH_CHANNEL_PORT_LISTENER 2 /* Listening on a port. */
|
#define SSH_CHANNEL_PORT_LISTENER 2 /* Listening on a port. */
|
||||||
#define SSH_CHANNEL_OPENING 3 /* waiting for confirmation */
|
#define SSH_CHANNEL_OPENING 3 /* waiting for confirmation */
|
||||||
|
@ -57,8 +56,10 @@
|
||||||
#define SSH_CHANNEL_DYNAMIC 13
|
#define SSH_CHANNEL_DYNAMIC 13
|
||||||
#define SSH_CHANNEL_MAX_TYPE 14
|
#define SSH_CHANNEL_MAX_TYPE 14
|
||||||
|
|
||||||
|
#define SSH_CHANNEL_PATH_LEN 30
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Data structure for channel data. This is iniailized in channel_allocate
|
* Data structure for channel data. This is initialized in channel_new
|
||||||
* and cleared in channel_free.
|
* and cleared in channel_free.
|
||||||
*/
|
*/
|
||||||
struct Channel;
|
struct Channel;
|
||||||
|
@ -85,8 +86,8 @@ struct Channel {
|
||||||
Buffer output; /* data received over encrypted connection for
|
Buffer output; /* data received over encrypted connection for
|
||||||
* send on socket */
|
* send on socket */
|
||||||
Buffer extended;
|
Buffer extended;
|
||||||
char path[200]; /* path for unix domain sockets, or host name
|
char path[SSH_CHANNEL_PATH_LEN];
|
||||||
* for forwards */
|
/* path for unix domain sockets, or host name for forwards */
|
||||||
int listening_port; /* port being listened for forwards */
|
int listening_port; /* port being listened for forwards */
|
||||||
int host_port; /* remote port to connect for forwards */
|
int host_port; /* remote port to connect for forwards */
|
||||||
char *remote_name; /* remote hostname */
|
char *remote_name; /* remote hostname */
|
||||||
|
@ -133,10 +134,6 @@ void channel_register_filter(int id, channel_filter_fn *fn);
|
||||||
void channel_cancel_cleanup(int id);
|
void channel_cancel_cleanup(int id);
|
||||||
Channel *channel_lookup(int id);
|
Channel *channel_lookup(int id);
|
||||||
|
|
||||||
int
|
|
||||||
channel_new(char *ctype, int type, int rfd, int wfd, int efd,
|
|
||||||
int window, int maxpack, int extended_usage, char *remote_name,
|
|
||||||
int nonblock);
|
|
||||||
void
|
void
|
||||||
channel_set_fds(int id, int rfd, int wfd, int efd,
|
channel_set_fds(int id, int rfd, int wfd, int efd,
|
||||||
int extusage, int nonblock);
|
int extusage, int nonblock);
|
||||||
|
@ -163,10 +160,13 @@ void channel_set_options(int hostname_in_open);
|
||||||
* must have been allocated with xmalloc; this will free it when the channel
|
* must have been allocated with xmalloc; this will free it when the channel
|
||||||
* is freed.
|
* is freed.
|
||||||
*/
|
*/
|
||||||
int channel_allocate(int type, int sock, char *remote_name);
|
Channel *
|
||||||
|
channel_new(char *ctype, int type, int rfd, int wfd, int efd,
|
||||||
|
int window, int maxpack, int extended_usage, char *remote_name,
|
||||||
|
int nonblock);
|
||||||
|
|
||||||
/* Free the channel and close its socket. */
|
/* Free the channel and close its socket. */
|
||||||
void channel_free(int channel);
|
void channel_free(Channel *c);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate/update select bitmasks and add any bits relevant to channels in
|
* Allocate/update select bitmasks and add any bits relevant to channels in
|
||||||
|
@ -308,4 +308,6 @@ int channel_connect_to(const char *host, u_short host_port);
|
||||||
int channel_connect_by_listen_adress(u_short listen_port);
|
int channel_connect_by_listen_adress(u_short listen_port);
|
||||||
int x11_connect_display(void);
|
int x11_connect_display(void);
|
||||||
|
|
||||||
|
int channel_find_open(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: compat.c,v 1.1.1.6 2001/04/10 07:13:54 itojun Exp $ */
|
/* $NetBSD: compat.c,v 1.1.1.7 2001/05/15 15:02:27 itojun Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999,2000 Markus Friedl. All rights reserved.
|
* Copyright (c) 1999,2000 Markus Friedl. All rights reserved.
|
||||||
*
|
*
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
RCSID("$OpenBSD: compat.c,v 1.45 2001/04/05 11:09:16 markus Exp $");
|
RCSID("$OpenBSD: compat.c,v 1.50 2001/04/30 16:02:49 markus Exp $");
|
||||||
|
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
|
|
||||||
|
@ -78,19 +78,26 @@ compat_datafellows(const char *version)
|
||||||
{ "MindTerm", 0 },
|
{ "MindTerm", 0 },
|
||||||
{ "^2\\.1\\.0", SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
|
{ "^2\\.1\\.0", SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
|
||||||
SSH_OLD_SESSIONID|SSH_BUG_DEBUG|
|
SSH_OLD_SESSIONID|SSH_BUG_DEBUG|
|
||||||
SSH_BUG_RSASIGMD5 },
|
SSH_BUG_RSASIGMD5|SSH_BUG_HBSERVICE },
|
||||||
{ "^2\\.1 ", SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
|
{ "^2\\.1 ", SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
|
||||||
SSH_OLD_SESSIONID|SSH_BUG_DEBUG|
|
SSH_OLD_SESSIONID|SSH_BUG_DEBUG|
|
||||||
SSH_BUG_RSASIGMD5 },
|
SSH_BUG_RSASIGMD5|SSH_BUG_HBSERVICE },
|
||||||
{ "^2\\.0\\.1[3-9]", SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
|
{ "^2\\.0\\.1[3-9]", SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
|
||||||
SSH_OLD_SESSIONID|SSH_BUG_DEBUG|
|
SSH_OLD_SESSIONID|SSH_BUG_DEBUG|
|
||||||
SSH_BUG_PKSERVICE|SSH_BUG_X11FWD|
|
SSH_BUG_PKSERVICE|SSH_BUG_X11FWD|
|
||||||
SSH_BUG_PKOK|SSH_BUG_RSASIGMD5 },
|
SSH_BUG_PKOK|SSH_BUG_RSASIGMD5|
|
||||||
|
SSH_BUG_HBSERVICE|SSH_BUG_OPENFAILURE },
|
||||||
|
{ "^2\\.0\\.1[1-2]", SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
|
||||||
|
SSH_OLD_SESSIONID|SSH_BUG_DEBUG|
|
||||||
|
SSH_BUG_PKSERVICE|SSH_BUG_X11FWD|
|
||||||
|
SSH_BUG_PKAUTH|SSH_BUG_PKOK|
|
||||||
|
SSH_BUG_RSASIGMD5|SSH_BUG_OPENFAILURE },
|
||||||
{ "^2\\.0\\.", SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
|
{ "^2\\.0\\.", SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
|
||||||
SSH_OLD_SESSIONID|SSH_BUG_DEBUG|
|
SSH_OLD_SESSIONID|SSH_BUG_DEBUG|
|
||||||
SSH_BUG_PKSERVICE|SSH_BUG_X11FWD|
|
SSH_BUG_PKSERVICE|SSH_BUG_X11FWD|
|
||||||
SSH_BUG_PKAUTH|SSH_BUG_PKOK|
|
SSH_BUG_PKAUTH|SSH_BUG_PKOK|
|
||||||
SSH_BUG_RSASIGMD5 },
|
SSH_BUG_RSASIGMD5|SSH_BUG_OPENFAILURE|
|
||||||
|
SSH_BUG_DERIVEKEY },
|
||||||
{ "^2\\.[23]\\.0", SSH_BUG_HMAC|SSH_BUG_RSASIGMD5 },
|
{ "^2\\.[23]\\.0", SSH_BUG_HMAC|SSH_BUG_RSASIGMD5 },
|
||||||
{ "^2\\.3\\.", SSH_BUG_RSASIGMD5 },
|
{ "^2\\.3\\.", SSH_BUG_RSASIGMD5 },
|
||||||
{ "^2\\.[2-9]\\.", 0 },
|
{ "^2\\.[2-9]\\.", 0 },
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: compat.h,v 1.1.1.6 2001/04/10 07:13:54 itojun Exp $ */
|
/* $NetBSD: compat.h,v 1.1.1.7 2001/05/15 15:02:27 itojun Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999 Markus Friedl. All rights reserved.
|
* Copyright (c) 1999 Markus Friedl. All rights reserved.
|
||||||
*
|
*
|
||||||
|
@ -22,7 +22,7 @@
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
/* RCSID("$OpenBSD: compat.h,v 1.22 2001/04/05 11:09:17 markus Exp $"); */
|
/* RCSID("$OpenBSD: compat.h,v 1.25 2001/04/30 15:50:46 markus Exp $"); */
|
||||||
|
|
||||||
#ifndef COMPAT_H
|
#ifndef COMPAT_H
|
||||||
#define COMPAT_H
|
#define COMPAT_H
|
||||||
|
@ -32,22 +32,25 @@
|
||||||
#define SSH_PROTO_1_PREFERRED 0x02
|
#define SSH_PROTO_1_PREFERRED 0x02
|
||||||
#define SSH_PROTO_2 0x04
|
#define SSH_PROTO_2 0x04
|
||||||
|
|
||||||
#define SSH_BUG_SIGBLOB 0x0001
|
#define SSH_BUG_SIGBLOB 0x00000001
|
||||||
#define SSH_BUG_PKSERVICE 0x0002
|
#define SSH_BUG_PKSERVICE 0x00000002
|
||||||
#define SSH_BUG_HMAC 0x0004
|
#define SSH_BUG_HMAC 0x00000004
|
||||||
#define SSH_BUG_X11FWD 0x0008
|
#define SSH_BUG_X11FWD 0x00000008
|
||||||
#define SSH_OLD_SESSIONID 0x0010
|
#define SSH_OLD_SESSIONID 0x00000010
|
||||||
#define SSH_BUG_PKAUTH 0x0020
|
#define SSH_BUG_PKAUTH 0x00000020
|
||||||
#define SSH_BUG_DEBUG 0x0040
|
#define SSH_BUG_DEBUG 0x00000040
|
||||||
#define SSH_BUG_BANNER 0x0080
|
#define SSH_BUG_BANNER 0x00000080
|
||||||
#define SSH_BUG_IGNOREMSG 0x0100
|
#define SSH_BUG_IGNOREMSG 0x00000100
|
||||||
#define SSH_BUG_PKOK 0x0200
|
#define SSH_BUG_PKOK 0x00000200
|
||||||
#define SSH_BUG_PASSWORDPAD 0x0400
|
#define SSH_BUG_PASSWORDPAD 0x00000400
|
||||||
#define SSH_BUG_SCANNER 0x0800
|
#define SSH_BUG_SCANNER 0x00000800
|
||||||
#define SSH_BUG_BIGENDIANAES 0x1000
|
#define SSH_BUG_BIGENDIANAES 0x00001000
|
||||||
#define SSH_BUG_RSASIGMD5 0x2000
|
#define SSH_BUG_RSASIGMD5 0x00002000
|
||||||
#define SSH_OLD_DHGEX 0x4000
|
#define SSH_OLD_DHGEX 0x00004000
|
||||||
#define SSH_BUG_NOREKEY 0x8000
|
#define SSH_BUG_NOREKEY 0x00008000
|
||||||
|
#define SSH_BUG_HBSERVICE 0x00010000
|
||||||
|
#define SSH_BUG_OPENFAILURE 0x00020000
|
||||||
|
#define SSH_BUG_DERIVEKEY 0x00040000
|
||||||
|
|
||||||
void enable_compat13(void);
|
void enable_compat13(void);
|
||||||
void enable_compat20(void);
|
void enable_compat20(void);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* $NetBSD: key.h,v 1.1.1.5 2001/04/10 07:13:56 itojun Exp $ */
|
/* $NetBSD: key.h,v 1.1.1.6 2001/05/15 15:02:29 itojun Exp $ */
|
||||||
/* $OpenBSD: key.h,v 1.11 2001/03/12 22:02:01 markus Exp $ */
|
/* $OpenBSD: key.h,v 1.12 2001/04/17 10:53:24 markus Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2000 Markus Friedl. All rights reserved.
|
* Copyright (c) 2000 Markus Friedl. All rights reserved.
|
||||||
|
@ -68,6 +68,7 @@ int key_type_from_name(char *name);
|
||||||
Key *key_from_blob(char *blob, int blen);
|
Key *key_from_blob(char *blob, int blen);
|
||||||
int key_to_blob(Key *key, u_char **blobp, u_int *lenp);
|
int key_to_blob(Key *key, u_char **blobp, u_int *lenp);
|
||||||
char *key_ssh_name(Key *k);
|
char *key_ssh_name(Key *k);
|
||||||
|
int key_names_valid2(const char *names);
|
||||||
|
|
||||||
int
|
int
|
||||||
key_sign(
|
key_sign(
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: nchan.c,v 1.1.1.5 2001/04/10 07:13:57 itojun Exp $ */
|
/* $NetBSD: nchan.c,v 1.1.1.6 2001/05/15 15:02:30 itojun Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999 Markus Friedl. All rights reserved.
|
* Copyright (c) 1999 Markus Friedl. All rights reserved.
|
||||||
*
|
*
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
RCSID("$OpenBSD: nchan.c,v 1.23 2001/02/28 08:54:55 markus Exp $");
|
RCSID("$OpenBSD: nchan.c,v 1.24 2001/05/04 23:47:34 markus Exp $");
|
||||||
|
|
||||||
#include "ssh1.h"
|
#include "ssh1.h"
|
||||||
#include "ssh2.h"
|
#include "ssh2.h"
|
||||||
|
@ -392,9 +392,17 @@ chan_send_close2(Channel *c)
|
||||||
|
|
||||||
/* shared */
|
/* shared */
|
||||||
|
|
||||||
|
void
|
||||||
|
chan_mark_dead(Channel *c)
|
||||||
|
{
|
||||||
|
c->flags |= CHAN_DEAD;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
chan_is_dead(Channel *c)
|
chan_is_dead(Channel *c)
|
||||||
{
|
{
|
||||||
|
if (c->flags & CHAN_DEAD)
|
||||||
|
return 1;
|
||||||
if (c->istate != CHAN_INPUT_CLOSED || c->ostate != CHAN_OUTPUT_CLOSED)
|
if (c->istate != CHAN_INPUT_CLOSED || c->ostate != CHAN_OUTPUT_CLOSED)
|
||||||
return 0;
|
return 0;
|
||||||
if (!compat20) {
|
if (!compat20) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: nchan.h,v 1.1.1.4 2001/04/10 07:13:57 itojun Exp $ */
|
/* $NetBSD: nchan.h,v 1.1.1.5 2001/05/15 15:02:30 itojun Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999 Markus Friedl. All rights reserved.
|
* Copyright (c) 1999 Markus Friedl. All rights reserved.
|
||||||
*
|
*
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* RCSID("$OpenBSD: nchan.h,v 1.10 2001/02/28 08:54:55 markus Exp $"); */
|
/* RCSID("$OpenBSD: nchan.h,v 1.11 2001/05/04 23:47:34 markus Exp $"); */
|
||||||
|
|
||||||
#ifndef NCHAN_H
|
#ifndef NCHAN_H
|
||||||
#define NCHAN_H
|
#define NCHAN_H
|
||||||
|
@ -70,6 +70,7 @@
|
||||||
|
|
||||||
#define CHAN_CLOSE_SENT 0x01
|
#define CHAN_CLOSE_SENT 0x01
|
||||||
#define CHAN_CLOSE_RCVD 0x02
|
#define CHAN_CLOSE_RCVD 0x02
|
||||||
|
#define CHAN_DEAD 0x04
|
||||||
|
|
||||||
|
|
||||||
/* Channel EVENTS */
|
/* Channel EVENTS */
|
||||||
|
@ -86,6 +87,7 @@ extern chan_event_fn *chan_write_failed;
|
||||||
extern chan_event_fn *chan_obuf_empty;
|
extern chan_event_fn *chan_obuf_empty;
|
||||||
|
|
||||||
int chan_is_dead(Channel * c);
|
int chan_is_dead(Channel * c);
|
||||||
|
void chan_mark_dead(Channel * c);
|
||||||
|
|
||||||
void chan_init_iostates(Channel * c);
|
void chan_init_iostates(Channel * c);
|
||||||
void chan_init(void);
|
void chan_init(void);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: packet.h,v 1.1.1.5 2001/04/10 07:13:58 itojun Exp $ */
|
/* $NetBSD: packet.h,v 1.1.1.6 2001/05/15 15:02:30 itojun Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -12,7 +12,7 @@
|
||||||
* called by a name other than "ssh" or "Secure Shell".
|
* called by a name other than "ssh" or "Secure Shell".
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* RCSID("$OpenBSD: packet.h,v 1.21 2001/02/28 21:27:47 markus Exp $"); */
|
/* RCSID("$OpenBSD: packet.h,v 1.22 2001/04/14 16:33:20 stevesk Exp $"); */
|
||||||
|
|
||||||
#ifndef PACKET_H
|
#ifndef PACKET_H
|
||||||
#define PACKET_H
|
#define PACKET_H
|
||||||
|
@ -179,8 +179,8 @@ extern int max_packet_size;
|
||||||
int packet_set_maxsize(int s);
|
int packet_set_maxsize(int s);
|
||||||
#define packet_get_maxsize() max_packet_size
|
#define packet_get_maxsize() max_packet_size
|
||||||
|
|
||||||
/* Stores tty modes from the fd into current packet. */
|
/* Stores tty modes from the fd or tiop into current packet. */
|
||||||
void tty_make_modes(int fd);
|
void tty_make_modes(int fd, struct termios *tiop);
|
||||||
|
|
||||||
/* Parses tty modes for the fd from the current packet. */
|
/* Parses tty modes for the fd from the current packet. */
|
||||||
void tty_parse_modes(int fd, int *n_bytes_ptr);
|
void tty_parse_modes(int fd, int *n_bytes_ptr);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* $NetBSD: sftp-glob.h,v 1.1.1.2 2001/04/10 07:14:08 itojun Exp $ */
|
/* $NetBSD: sftp-glob.h,v 1.1.1.3 2001/05/15 15:02:34 itojun Exp $ */
|
||||||
/* $OpenBSD: sftp-glob.h,v 1.2 2001/04/05 10:42:53 markus Exp $ */
|
/* $OpenBSD: sftp-glob.h,v 1.3 2001/04/15 08:43:46 markus Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001 Damien Miller. All rights reserved.
|
* Copyright (c) 2001 Damien Miller. All rights reserved.
|
||||||
|
@ -29,5 +29,5 @@
|
||||||
|
|
||||||
int
|
int
|
||||||
remote_glob(int fd_in, int fd_out, const char *pattern, int flags,
|
remote_glob(int fd_in, int fd_out, const char *pattern, int flags,
|
||||||
const int (*errfunc)(const char *, int), glob_t *pglob);
|
int (*errfunc)(const char *, int), glob_t *pglob);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
.\" $NetBSD: sftp-server.8,v 1.1.1.5 2001/04/10 07:14:09 itojun Exp $
|
.\" $NetBSD: sftp-server.8,v 1.1.1.6 2001/05/15 15:02:34 itojun Exp $
|
||||||
.\" $OpenBSD: sftp-server.8,v 1.5 2001/03/02 18:54:31 deraadt Exp $
|
.\" $OpenBSD: sftp-server.8,v 1.6 2001/04/22 13:32:26 markus Exp $
|
||||||
.\"
|
.\"
|
||||||
.\" Copyright (c) 2000 Markus Friedl. All rights reserved.
|
.\" Copyright (c) 2000 Markus Friedl. All rights reserved.
|
||||||
.\"
|
.\"
|
||||||
|
@ -45,10 +45,17 @@ See
|
||||||
.Xr sshd 8
|
.Xr sshd 8
|
||||||
for more information.
|
for more information.
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
|
.Xr sftp 1 ,
|
||||||
.Xr ssh 1 ,
|
.Xr ssh 1 ,
|
||||||
.Xr ssh-add 1 ,
|
|
||||||
.Xr ssh-keygen 1 ,
|
|
||||||
.Xr sshd 8
|
.Xr sshd 8
|
||||||
|
.Rs
|
||||||
|
.%A T. Ylonen
|
||||||
|
.%A S. Lehtinen
|
||||||
|
.%T "SSH File Transfer Protocol"
|
||||||
|
.%N draft-ietf-secsh-filexfer-00.txt
|
||||||
|
.%D January 2001
|
||||||
|
.%O work in progress material
|
||||||
|
.Re
|
||||||
.Sh AUTHORS
|
.Sh AUTHORS
|
||||||
Markus Friedl <markus@openbsd.org>
|
Markus Friedl <markus@openbsd.org>
|
||||||
.Sh HISTORY
|
.Sh HISTORY
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* $NetBSD: sshconnect.h,v 1.1.1.4 2001/04/10 07:14:16 itojun Exp $ */
|
/* $NetBSD: sshconnect.h,v 1.1.1.5 2001/05/15 15:02:38 itojun Exp $ */
|
||||||
/* $OpenBSD: sshconnect.h,v 1.8 2001/04/06 21:00:15 markus Exp $ */
|
/* $OpenBSD: sshconnect.h,v 1.9 2001/04/12 19:15:25 markus Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2000 Markus Friedl. All rights reserved.
|
* Copyright (c) 2000 Markus Friedl. All rights reserved.
|
||||||
|
@ -26,46 +26,30 @@
|
||||||
*/
|
*/
|
||||||
#ifndef SSHCONNECT_H
|
#ifndef SSHCONNECT_H
|
||||||
#define SSHCONNECT_H
|
#define SSHCONNECT_H
|
||||||
/*
|
|
||||||
* Opens a TCP/IP connection to the remote server on the given host. If port
|
|
||||||
* is 0, the default port will be used. If anonymous is zero, a privileged
|
|
||||||
* port will be allocated to make the connection. This requires super-user
|
|
||||||
* privileges if anonymous is false. Connection_attempts specifies the
|
|
||||||
* maximum number of tries, one per second. This returns true on success,
|
|
||||||
* and zero on failure. If the connection is successful, this calls
|
|
||||||
* packet_set_connection for the connection.
|
|
||||||
*/
|
|
||||||
int
|
int
|
||||||
ssh_connect(const char *host, struct sockaddr_storage * hostaddr,
|
ssh_connect(const char *host, struct sockaddr_storage * hostaddr,
|
||||||
u_short port, int connection_attempts,
|
u_short port, int connection_attempts,
|
||||||
int anonymous, struct passwd *pw,
|
int anonymous, struct passwd *pw,
|
||||||
const char *proxy_command);
|
const char *proxy_command);
|
||||||
|
|
||||||
/*
|
|
||||||
* Starts a dialog with the server, and authenticates the current user on the
|
|
||||||
* server. This does not need any extra privileges. The basic connection to
|
|
||||||
* the server must already have been established before this is called. If
|
|
||||||
* login fails, this function prints an error and never returns. This
|
|
||||||
* initializes the random state, and leaves it initialized (it will also have
|
|
||||||
* references from the packet module).
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ssh_login(Key *host_key, const char *host,
|
ssh_login(Key **keys, int nkeys, const char *orighost,
|
||||||
struct sockaddr * hostaddr, struct passwd *pw);
|
struct sockaddr *hostaddr, struct passwd *pw);
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
check_host_key(char *host, struct sockaddr *hostaddr, Key *host_key,
|
check_host_key(char *host, struct sockaddr *hostaddr, Key *host_key,
|
||||||
const char *user_hostfile, const char *system_hostfile);
|
const char *user_hostfile, const char *system_hostfile);
|
||||||
|
|
||||||
void ssh_kex(char *host, struct sockaddr *hostaddr);
|
void ssh_kex(char *host, struct sockaddr *hostaddr);
|
||||||
void
|
|
||||||
ssh_userauth(const char * local_user, const char * server_user, char *host,
|
|
||||||
Key *own_host_key);
|
|
||||||
|
|
||||||
void ssh_kex2(char *host, struct sockaddr *hostaddr);
|
void ssh_kex2(char *host, struct sockaddr *hostaddr);
|
||||||
void ssh_userauth2(const char *server_user, char *host);
|
|
||||||
|
void
|
||||||
|
ssh_userauth1(const char *local_user, const char *server_user, char *host,
|
||||||
|
Key **keys, int nkeys);
|
||||||
|
void
|
||||||
|
ssh_userauth2(const char *local_user, const char *server_user, char *host,
|
||||||
|
Key **keys, int nkeys);
|
||||||
|
|
||||||
void ssh_put_password(char *password);
|
void ssh_put_password(char *password);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
/* $NetBSD: sshtty.c,v 1.1.1.1 2001/05/15 15:02:41 itojun Exp $ */
|
||||||
|
/* $OpenBSD: sshtty.c,v 1.1 2001/04/14 16:33:20 stevesk Exp $ */
|
||||||
|
/*
|
||||||
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
* All rights reserved
|
||||||
|
*
|
||||||
|
* As far as I am concerned, the code I have written for this software
|
||||||
|
* can be used freely for any purpose. Any derived versions of this
|
||||||
|
* software must be clearly marked as such, and if the derived work is
|
||||||
|
* incompatible with the protocol description in the RFC file, it must be
|
||||||
|
* called by a name other than "ssh" or "Secure Shell".
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2001 Markus Friedl. All rights reserved.
|
||||||
|
* Copyright (c) 2001 Kevin Steves. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "includes.h"
|
||||||
|
|
||||||
|
#include "sshtty.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
|
static struct termios _saved_tio;
|
||||||
|
static int _in_raw_mode = 0;
|
||||||
|
|
||||||
|
int
|
||||||
|
in_raw_mode(void)
|
||||||
|
{
|
||||||
|
return _in_raw_mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct termios
|
||||||
|
get_saved_tio(void)
|
||||||
|
{
|
||||||
|
return _saved_tio;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
leave_raw_mode(void)
|
||||||
|
{
|
||||||
|
if (!_in_raw_mode)
|
||||||
|
return;
|
||||||
|
if (tcsetattr(fileno(stdin), TCSADRAIN, &_saved_tio) == -1)
|
||||||
|
perror("tcsetattr");
|
||||||
|
else
|
||||||
|
_in_raw_mode = 0;
|
||||||
|
|
||||||
|
fatal_remove_cleanup((void (*) (void *)) leave_raw_mode, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
enter_raw_mode(void)
|
||||||
|
{
|
||||||
|
struct termios tio;
|
||||||
|
|
||||||
|
if (tcgetattr(fileno(stdin), &tio) == -1) {
|
||||||
|
perror("tcgetattr");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_saved_tio = tio;
|
||||||
|
tio.c_iflag |= IGNPAR;
|
||||||
|
tio.c_iflag &= ~(ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXANY | IXOFF);
|
||||||
|
tio.c_lflag &= ~(ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHONL);
|
||||||
|
#ifdef IEXTEN
|
||||||
|
tio.c_lflag &= ~IEXTEN;
|
||||||
|
#endif
|
||||||
|
tio.c_oflag &= ~OPOST;
|
||||||
|
tio.c_cc[VMIN] = 1;
|
||||||
|
tio.c_cc[VTIME] = 0;
|
||||||
|
if (tcsetattr(fileno(stdin), TCSADRAIN, &tio) == -1)
|
||||||
|
perror("tcsetattr");
|
||||||
|
else
|
||||||
|
_in_raw_mode = 1;
|
||||||
|
|
||||||
|
fatal_add_cleanup((void (*) (void *)) leave_raw_mode, NULL);
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
/* $NetBSD: sshtty.h,v 1.1.1.1 2001/05/15 15:02:41 itojun Exp $ */
|
||||||
|
/* $OpenBSD: sshtty.h,v 1.1 2001/04/14 16:33:20 stevesk Exp $ */
|
||||||
|
/*
|
||||||
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
* All rights reserved
|
||||||
|
*
|
||||||
|
* As far as I am concerned, the code I have written for this software
|
||||||
|
* can be used freely for any purpose. Any derived versions of this
|
||||||
|
* software must be clearly marked as such, and if the derived work is
|
||||||
|
* incompatible with the protocol description in the RFC file, it must be
|
||||||
|
* called by a name other than "ssh" or "Secure Shell".
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2001 Markus Friedl. All rights reserved.
|
||||||
|
* Copyright (c) 2001 Kevin Steves. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SSHTTY_H
|
||||||
|
#define SSHTTY_H
|
||||||
|
|
||||||
|
#include <termios.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Accessor function indicating whether we are in raw mode. Set by
|
||||||
|
* enter_raw_mode() and leave_raw_mode().
|
||||||
|
*/
|
||||||
|
int in_raw_mode(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return terminal modes, as saved by enter_raw_mode().
|
||||||
|
*/
|
||||||
|
struct termios get_saved_tio(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns the user's terminal to normal mode if it had been
|
||||||
|
* put in raw mode.
|
||||||
|
*/
|
||||||
|
void leave_raw_mode(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Puts the user's terminal in raw mode.
|
||||||
|
*/
|
||||||
|
void enter_raw_mode(void);
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,12 +1,8 @@
|
||||||
/* $NetBSD: ttymodes.c,v 1.1.1.4 2001/04/10 07:14:22 itojun Exp $ */
|
/* $NetBSD: ttymodes.c,v 1.1.1.5 2001/05/15 15:02:40 itojun Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
* All rights reserved
|
* All rights reserved
|
||||||
* Encoding and decoding of terminal modes in a portable way.
|
|
||||||
* Much of the format is defined in ttymodes.h; it is included multiple times
|
|
||||||
* into this file with the appropriate macro definitions to generate the
|
|
||||||
* suitable code.
|
|
||||||
*
|
*
|
||||||
* As far as I am concerned, the code I have written for this software
|
* As far as I am concerned, the code I have written for this software
|
||||||
* can be used freely for any purpose. Any derived versions of this
|
* can be used freely for any purpose. Any derived versions of this
|
||||||
|
@ -15,16 +11,56 @@
|
||||||
* called by a name other than "ssh" or "Secure Shell".
|
* called by a name other than "ssh" or "Secure Shell".
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SSH2 tty modes support by Kevin Steves.
|
||||||
|
* Copyright (c) 2001 Kevin Steves. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Encoding and decoding of terminal modes in a portable way.
|
||||||
|
* Much of the format is defined in ttymodes.h; it is included multiple times
|
||||||
|
* into this file with the appropriate macro definitions to generate the
|
||||||
|
* suitable code.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
RCSID("$OpenBSD: ttymodes.c,v 1.11 2001/03/10 15:02:05 stevesk Exp $");
|
RCSID("$OpenBSD: ttymodes.c,v 1.13 2001/04/15 01:35:22 stevesk Exp $");
|
||||||
|
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "ssh1.h"
|
#include "ssh1.h"
|
||||||
|
#include "compat.h"
|
||||||
|
#include "buffer.h"
|
||||||
|
#include "bufaux.h"
|
||||||
|
|
||||||
#define TTY_OP_END 0
|
#define TTY_OP_END 0
|
||||||
#define TTY_OP_ISPEED 192 /* int follows */
|
/*
|
||||||
#define TTY_OP_OSPEED 193 /* int follows */
|
* uint32 (u_int) follows speed in SSH1 and SSH2
|
||||||
|
*/
|
||||||
|
#define TTY_OP_ISPEED_PROTO1 192
|
||||||
|
#define TTY_OP_OSPEED_PROTO1 193
|
||||||
|
#define TTY_OP_ISPEED_PROTO2 128
|
||||||
|
#define TTY_OP_OSPEED_PROTO2 129
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Converts POSIX speed_t to a baud rate. The values of the
|
* Converts POSIX speed_t to a baud rate. The values of the
|
||||||
|
@ -123,7 +159,7 @@ static speed_t
|
||||||
baud_to_speed(int baud)
|
baud_to_speed(int baud)
|
||||||
{
|
{
|
||||||
switch (baud) {
|
switch (baud) {
|
||||||
case 0:
|
case 0:
|
||||||
return B0;
|
return B0;
|
||||||
case 50:
|
case 50:
|
||||||
return B50;
|
return B50;
|
||||||
|
@ -207,41 +243,72 @@ baud_to_speed(int baud)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Encodes terminal modes for the terminal referenced by fd
|
* Encodes terminal modes for the terminal referenced by fd
|
||||||
* in a portable manner, and appends the modes to a packet
|
* or tiop in a portable manner, and appends the modes to a packet
|
||||||
* being constructed.
|
* being constructed.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
tty_make_modes(int fd)
|
tty_make_modes(int fd, struct termios *tiop)
|
||||||
{
|
{
|
||||||
struct termios tio;
|
struct termios tio;
|
||||||
int baud;
|
int baud;
|
||||||
|
Buffer buf;
|
||||||
|
int tty_op_ospeed, tty_op_ispeed;
|
||||||
|
void (*put_arg)(Buffer *, u_int);
|
||||||
|
|
||||||
if (tcgetattr(fd, &tio) < 0) {
|
buffer_init(&buf);
|
||||||
packet_put_char(TTY_OP_END);
|
if (compat20) {
|
||||||
log("tcgetattr: %.100s", strerror(errno));
|
tty_op_ospeed = TTY_OP_OSPEED_PROTO2;
|
||||||
return;
|
tty_op_ispeed = TTY_OP_ISPEED_PROTO2;
|
||||||
|
put_arg = buffer_put_int;
|
||||||
|
} else {
|
||||||
|
tty_op_ospeed = TTY_OP_OSPEED_PROTO1;
|
||||||
|
tty_op_ispeed = TTY_OP_ISPEED_PROTO1;
|
||||||
|
put_arg = (void (*)(Buffer *, u_int)) buffer_put_char;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tiop == NULL) {
|
||||||
|
if (tcgetattr(fd, &tio) == -1) {
|
||||||
|
log("tcgetattr: %.100s", strerror(errno));
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
tio = *tiop;
|
||||||
|
|
||||||
/* Store input and output baud rates. */
|
/* Store input and output baud rates. */
|
||||||
baud = speed_to_baud(cfgetospeed(&tio));
|
baud = speed_to_baud(cfgetospeed(&tio));
|
||||||
packet_put_char(TTY_OP_OSPEED);
|
debug2("tty_make_modes: ospeed %d", baud);
|
||||||
packet_put_int(baud);
|
buffer_put_char(&buf, tty_op_ospeed);
|
||||||
|
buffer_put_int(&buf, baud);
|
||||||
baud = speed_to_baud(cfgetispeed(&tio));
|
baud = speed_to_baud(cfgetispeed(&tio));
|
||||||
packet_put_char(TTY_OP_ISPEED);
|
debug2("tty_make_modes: ispeed %d", baud);
|
||||||
packet_put_int(baud);
|
buffer_put_char(&buf, tty_op_ispeed);
|
||||||
|
buffer_put_int(&buf, baud);
|
||||||
|
|
||||||
/* Store values of mode flags. */
|
/* Store values of mode flags. */
|
||||||
#define TTYCHAR(NAME, OP) \
|
#define TTYCHAR(NAME, OP) \
|
||||||
packet_put_char(OP); packet_put_char(tio.c_cc[NAME]);
|
debug2("tty_make_modes: %d %d", OP, tio.c_cc[NAME]); \
|
||||||
|
buffer_put_char(&buf, OP); \
|
||||||
|
put_arg(&buf, tio.c_cc[NAME]);
|
||||||
|
|
||||||
#define TTYMODE(NAME, FIELD, OP) \
|
#define TTYMODE(NAME, FIELD, OP) \
|
||||||
packet_put_char(OP); packet_put_char((tio.FIELD & NAME) != 0);
|
debug2("tty_make_modes: %d %d", OP, ((tio.FIELD & NAME) != 0)); \
|
||||||
|
buffer_put_char(&buf, OP); \
|
||||||
|
put_arg(&buf, ((tio.FIELD & NAME) != 0));
|
||||||
|
|
||||||
#include "ttymodes.h"
|
#include "ttymodes.h"
|
||||||
|
|
||||||
#undef TTYCHAR
|
#undef TTYCHAR
|
||||||
#undef TTYMODE
|
#undef TTYMODE
|
||||||
|
|
||||||
|
end:
|
||||||
/* Mark end of mode data. */
|
/* Mark end of mode data. */
|
||||||
packet_put_char(TTY_OP_END);
|
buffer_put_char(&buf, TTY_OP_END);
|
||||||
|
if (compat20)
|
||||||
|
packet_put_string(buffer_ptr(&buf), buffer_len(&buf));
|
||||||
|
else
|
||||||
|
packet_put_raw(buffer_ptr(&buf), buffer_len(&buf));
|
||||||
|
buffer_free(&buf);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -255,14 +322,30 @@ tty_parse_modes(int fd, int *n_bytes_ptr)
|
||||||
int opcode, baud;
|
int opcode, baud;
|
||||||
int n_bytes = 0;
|
int n_bytes = 0;
|
||||||
int failure = 0;
|
int failure = 0;
|
||||||
|
u_int (*get_arg)(void);
|
||||||
|
int arg, arg_size;
|
||||||
|
|
||||||
|
if (compat20) {
|
||||||
|
*n_bytes_ptr = packet_get_int();
|
||||||
|
debug2("tty_parse_modes: SSH2 n_bytes %d", *n_bytes_ptr);
|
||||||
|
if (*n_bytes_ptr == 0)
|
||||||
|
return;
|
||||||
|
get_arg = packet_get_int;
|
||||||
|
arg_size = 4;
|
||||||
|
} else {
|
||||||
|
get_arg = packet_get_char;
|
||||||
|
arg_size = 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get old attributes for the terminal. We will modify these
|
* Get old attributes for the terminal. We will modify these
|
||||||
* flags. I am hoping that if there are any machine-specific
|
* flags. I am hoping that if there are any machine-specific
|
||||||
* modes, they will initially have reasonable values.
|
* modes, they will initially have reasonable values.
|
||||||
*/
|
*/
|
||||||
if (tcgetattr(fd, &tio) < 0)
|
if (tcgetattr(fd, &tio) == -1) {
|
||||||
|
log("tcgetattr: %.100s", strerror(errno));
|
||||||
failure = -1;
|
failure = -1;
|
||||||
|
}
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
n_bytes += 1;
|
n_bytes += 1;
|
||||||
|
@ -271,32 +354,40 @@ tty_parse_modes(int fd, int *n_bytes_ptr)
|
||||||
case TTY_OP_END:
|
case TTY_OP_END:
|
||||||
goto set;
|
goto set;
|
||||||
|
|
||||||
case TTY_OP_ISPEED:
|
/* XXX: future conflict possible */
|
||||||
|
case TTY_OP_ISPEED_PROTO1:
|
||||||
|
case TTY_OP_ISPEED_PROTO2:
|
||||||
n_bytes += 4;
|
n_bytes += 4;
|
||||||
baud = packet_get_int();
|
baud = packet_get_int();
|
||||||
if (failure != -1 && cfsetispeed(&tio, baud_to_speed(baud)) < 0)
|
debug2("tty_parse_modes: ispeed %d", baud);
|
||||||
|
if (failure != -1 && cfsetispeed(&tio, baud_to_speed(baud)) == -1)
|
||||||
error("cfsetispeed failed for %d", baud);
|
error("cfsetispeed failed for %d", baud);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TTY_OP_OSPEED:
|
/* XXX: future conflict possible */
|
||||||
|
case TTY_OP_OSPEED_PROTO1:
|
||||||
|
case TTY_OP_OSPEED_PROTO2:
|
||||||
n_bytes += 4;
|
n_bytes += 4;
|
||||||
baud = packet_get_int();
|
baud = packet_get_int();
|
||||||
if (failure != -1 && cfsetospeed(&tio, baud_to_speed(baud)) < 0)
|
debug2("tty_parse_modes: ospeed %d", baud);
|
||||||
|
if (failure != -1 && cfsetospeed(&tio, baud_to_speed(baud)) == -1)
|
||||||
error("cfsetospeed failed for %d", baud);
|
error("cfsetospeed failed for %d", baud);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#define TTYCHAR(NAME, OP) \
|
#define TTYCHAR(NAME, OP) \
|
||||||
case OP: \
|
case OP: \
|
||||||
n_bytes += 1; \
|
n_bytes += arg_size; \
|
||||||
tio.c_cc[NAME] = packet_get_char(); \
|
tio.c_cc[NAME] = get_arg(); \
|
||||||
|
debug2("tty_parse_modes: %d %d", OP, tio.c_cc[NAME]); \
|
||||||
break;
|
break;
|
||||||
#define TTYMODE(NAME, FIELD, OP) \
|
#define TTYMODE(NAME, FIELD, OP) \
|
||||||
case OP: \
|
case OP: \
|
||||||
n_bytes += 1; \
|
n_bytes += arg_size; \
|
||||||
if (packet_get_char()) \
|
if ((arg = get_arg())) \
|
||||||
tio.FIELD |= NAME; \
|
tio.FIELD |= NAME; \
|
||||||
else \
|
else \
|
||||||
tio.FIELD &= ~NAME; \
|
tio.FIELD &= ~NAME; \
|
||||||
|
debug2("tty_parse_modes: %d %d", OP, arg); \
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#include "ttymodes.h"
|
#include "ttymodes.h"
|
||||||
|
@ -307,48 +398,66 @@ tty_parse_modes(int fd, int *n_bytes_ptr)
|
||||||
default:
|
default:
|
||||||
debug("Ignoring unsupported tty mode opcode %d (0x%x)",
|
debug("Ignoring unsupported tty mode opcode %d (0x%x)",
|
||||||
opcode, opcode);
|
opcode, opcode);
|
||||||
/*
|
if (!compat20) {
|
||||||
* Opcodes 0 to 127 are defined to have
|
/*
|
||||||
* a one-byte argument.
|
* SSH1:
|
||||||
*/
|
* Opcodes 1 to 127 are defined to have
|
||||||
if (opcode >= 0 && opcode < 128) {
|
* a one-byte argument.
|
||||||
n_bytes += 1;
|
* Opcodes 128 to 159 are defined to have
|
||||||
(void) packet_get_char();
|
* an integer argument.
|
||||||
break;
|
*/
|
||||||
|
if (opcode > 0 && opcode < 128) {
|
||||||
|
n_bytes += 1;
|
||||||
|
(void) packet_get_char();
|
||||||
|
break;
|
||||||
|
} else if (opcode >= 128 && opcode < 160) {
|
||||||
|
n_bytes += 4;
|
||||||
|
(void) packet_get_int();
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* It is a truly undefined opcode (160 to 255).
|
||||||
|
* We have no idea about its arguments. So we
|
||||||
|
* must stop parsing. Note that some data may be
|
||||||
|
* left in the packet; hopefully there is nothing
|
||||||
|
* more coming after the mode data.
|
||||||
|
*/
|
||||||
|
log("parse_tty_modes: unknown opcode %d", opcode);
|
||||||
|
packet_integrity_check(0, 1, SSH_CMSG_REQUEST_PTY);
|
||||||
|
goto set;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Opcodes 128 to 159 are defined to have
|
* SSH2:
|
||||||
* an integer argument.
|
* Opcodes 1 to 159 are defined to have
|
||||||
|
* a uint32 argument.
|
||||||
|
* Opcodes 160 to 255 are undefined and
|
||||||
|
* cause parsing to stop.
|
||||||
*/
|
*/
|
||||||
if (opcode >= 128 && opcode < 160) {
|
if (opcode > 0 && opcode < 160) {
|
||||||
n_bytes += 4;
|
n_bytes += 4;
|
||||||
(void) packet_get_int();
|
(void) packet_get_int();
|
||||||
break;
|
break;
|
||||||
|
} else {
|
||||||
|
log("parse_tty_modes: unknown opcode %d", opcode);
|
||||||
|
goto set;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* It is a truly undefined opcode (160 to 255).
|
|
||||||
* We have no idea about its arguments. So we
|
|
||||||
* must stop parsing. Note that some data may be
|
|
||||||
* left in the packet; hopefully there is nothing
|
|
||||||
* more coming after the mode data.
|
|
||||||
*/
|
|
||||||
log("parse_tty_modes: unknown opcode %d", opcode);
|
|
||||||
packet_integrity_check(0, 1, SSH_CMSG_REQUEST_PTY);
|
|
||||||
goto set;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
set:
|
set:
|
||||||
if (*n_bytes_ptr != n_bytes) {
|
if (*n_bytes_ptr != n_bytes) {
|
||||||
*n_bytes_ptr = n_bytes;
|
*n_bytes_ptr = n_bytes;
|
||||||
|
log("parse_tty_modes: n_bytes_ptr != n_bytes: %d %d",
|
||||||
|
*n_bytes_ptr, n_bytes);
|
||||||
return; /* Don't process bytes passed */
|
return; /* Don't process bytes passed */
|
||||||
}
|
}
|
||||||
if (failure == -1)
|
if (failure == -1)
|
||||||
return; /* Packet parsed ok but tty stuff failed */
|
return; /* Packet parsed ok but tcgetattr() failed */
|
||||||
|
|
||||||
/* Set the new modes for the terminal. */
|
/* Set the new modes for the terminal. */
|
||||||
if (tcsetattr(fd, TCSANOW, &tio) < 0)
|
if (tcsetattr(fd, TCSANOW, &tio) == -1)
|
||||||
log("Setting tty modes failed: %.100s", strerror(errno));
|
log("Setting tty modes failed: %.100s", strerror(errno));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* $NetBSD: ttymodes.h,v 1.1.1.4 2001/04/10 07:14:23 itojun Exp $ */
|
/* $NetBSD: ttymodes.h,v 1.1.1.5 2001/05/15 15:02:40 itojun Exp $ */
|
||||||
|
/* RCSID("$OpenBSD: ttymodes.h,v 1.11 2001/04/14 16:33:20 stevesk Exp $"); */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* SGTTY stuff contributed by Janne Snabb <snabb@niksula.hut.fi>
|
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
* All rights reserved
|
* All rights reserved
|
||||||
*
|
*
|
||||||
|
@ -12,14 +12,47 @@
|
||||||
* called by a name other than "ssh" or "Secure Shell".
|
* called by a name other than "ssh" or "Secure Shell".
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* RCSID("$OpenBSD: ttymodes.h,v 1.10 2001/03/10 15:02:05 stevesk Exp $"); */
|
/*
|
||||||
|
* SSH2 tty modes support by Kevin Steves.
|
||||||
|
* Copyright (c) 2001 Kevin Steves. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
/* The tty mode description is a stream of bytes. The stream consists of
|
/*
|
||||||
|
* SSH1:
|
||||||
|
* The tty mode description is a stream of bytes. The stream consists of
|
||||||
* opcode-arguments pairs. It is terminated by opcode TTY_OP_END (0).
|
* opcode-arguments pairs. It is terminated by opcode TTY_OP_END (0).
|
||||||
* Opcodes 1-127 have one-byte arguments. Opcodes 128-159 have integer
|
* Opcodes 1-127 have one-byte arguments. Opcodes 128-159 have integer
|
||||||
* arguments. Opcodes 160-255 are not yet defined, and cause parsing to
|
* arguments. Opcodes 160-255 are not yet defined, and cause parsing to
|
||||||
* stop (they should only be used after any other data).
|
* stop (they should only be used after any other data).
|
||||||
*
|
*
|
||||||
|
* SSH2:
|
||||||
|
* Differences between SSH1 and SSH2 terminal mode encoding include:
|
||||||
|
* 1. Encoded terminal modes are represented as a string, and a stream
|
||||||
|
* of bytes within that string.
|
||||||
|
* 2. Opcode arguments are uint32 (1-159); 160-255 remain undefined.
|
||||||
|
* 3. The values for TTY_OP_ISPEED and TTY_OP_OSPEED are different;
|
||||||
|
* 128 and 129 vs. 192 and 193 respectively.
|
||||||
|
*
|
||||||
* The client puts in the stream any modes it knows about, and the
|
* The client puts in the stream any modes it knows about, and the
|
||||||
* server ignores any modes it does not know about. This allows some degree
|
* server ignores any modes it does not know about. This allows some degree
|
||||||
* of machine-independence, at least between systems that use a posix-like
|
* of machine-independence, at least between systems that use a posix-like
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: uidswap.c,v 1.1.1.4 2001/04/10 07:14:23 itojun Exp $ */
|
/* $NetBSD: uidswap.c,v 1.1.1.5 2001/05/15 15:02:40 itojun Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -13,7 +13,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
RCSID("$OpenBSD: uidswap.c,v 1.15 2001/04/08 11:24:33 markus Exp $");
|
RCSID("$OpenBSD: uidswap.c,v 1.16 2001/04/20 16:32:22 markus Exp $");
|
||||||
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "uidswap.h"
|
#include "uidswap.h"
|
||||||
|
@ -82,7 +82,7 @@ temporarily_use_uid(struct passwd *pw)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Restores to the original uid.
|
* Restores to the original (privileged) uid.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
restore_uid(void)
|
restore_uid(void)
|
||||||
|
@ -93,7 +93,7 @@ restore_uid(void)
|
||||||
return;
|
return;
|
||||||
if (!temporarily_use_uid_effective)
|
if (!temporarily_use_uid_effective)
|
||||||
fatal("restore_uid: temporarily_use_uid not effective");
|
fatal("restore_uid: temporarily_use_uid not effective");
|
||||||
/* Set the effective uid back to the saved uid. */
|
/* Set the effective uid back to the saved privileged uid. */
|
||||||
if (seteuid(saved_euid) < 0)
|
if (seteuid(saved_euid) < 0)
|
||||||
fatal("seteuid %u: %.100s", (u_int) saved_euid, strerror(errno));
|
fatal("seteuid %u: %.100s", (u_int) saved_euid, strerror(errno));
|
||||||
if (setgroups(saved_egroupslen, saved_egroups) < 0)
|
if (setgroups(saved_egroupslen, saved_egroups) < 0)
|
||||||
|
@ -112,8 +112,8 @@ permanently_set_uid(struct passwd *pw)
|
||||||
{
|
{
|
||||||
if (temporarily_use_uid_effective)
|
if (temporarily_use_uid_effective)
|
||||||
fatal("restore_uid: temporarily_use_uid effective");
|
fatal("restore_uid: temporarily_use_uid effective");
|
||||||
if (setuid(pw->pw_uid) < 0)
|
|
||||||
fatal("setuid %u: %.100s", (u_int) pw->pw_uid, strerror(errno));
|
|
||||||
if (setgid(pw->pw_gid) < 0)
|
if (setgid(pw->pw_gid) < 0)
|
||||||
fatal("setgid %u: %.100s", (u_int) pw->pw_gid, strerror(errno));
|
fatal("setgid %u: %.100s", (u_int) pw->pw_gid, strerror(errno));
|
||||||
|
if (setuid(pw->pw_uid) < 0)
|
||||||
|
fatal("setuid %u: %.100s", (u_int) pw->pw_uid, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue